본문으로 바로가기

Spring 이론(응용) - ORACLE 페이징처리

category 웹/Spring 2019. 8. 10. 00:46

오라클 데이터베이스 페이징 처리

페이징 처리 시 order by를 사용하면 문제가 있습니다.

바로 데이터가 많은 경우 엄청난 성능의 저하를 일으킵니다. 매번 정렬을 해야하기 때문입니다.

order by는 1) 데이터 적은 경우 2) 정렬을 빠르게 할 수 있는 방법이 있는 경우 에 사용합시다.

따라서 인덱스를 사용합시다. 

방법 1 ) HINT를 사용함
select 
	/* INDEX_DESC(tbl_board pk_board) */
    *
from
	tbl_board
where bno > 0;

---------------------------------------------
방법 2) 인덱스 bno로 생성 후 사용
select * from tbl_board order by bno;

인덱스를 사용하면 정렬하지 않고 PK_BOARD를 통해서 접근하기 때문에 엄청나게 빠릅니다. 왜냐하면 인덱스는 정렬이 되어있기 때문이죠. 

따라서 위 방법으로 사용하게 되면 order by 절을 사용하지 않아도 됩니다.

 

이제 페이징 처리를 하려면 원하는 개수만큼 잘라서 가져와야합니다. 이는 ROWNUM과 인라인 뷰를 사용합니다.

ROWNUM은 실행 결과에 숫자를 붙여줍니다. 실제 데이터가 아닙니다. 즉 상황에 따라 바뀔수 도 있다는 뜻입니다.

select rownum rn, bno, title from tbl_board;

이를 위해서 기본키(인덱스)로 접근하려면 pk_board를 통해 테이블에 접근하고 접근한 데이터에 ROWNUM을 붙여줍니다. 즉 게시글 번호가 제일 큰 것을 rownum을 1로 부여할 수 있습니다. 즉 rownum이 1~10까지 1페이지 입니다.

 

select /*+INDEX_DESC(tbl_board pk_board) */
	rownum rn, bno, title,content
from
	tbl_board
where rownum<=10;

단 rownum은 1을 반드시 포함해야하기 때문에 rownum>=10 and rownum<=20 조건으로 작성하면 나오지가 않습니다.

 

따라서 인라인뷰를 처리하여 적용시켜야합니다. 인라인뷰는 select 안쪽 from에 다시 select 문입니다.

select
	bno,title, content
from
	(
    	select /*+INDEX_DESC(tbl_board pk_board)*/
        	rownum rn, bno, title, content
        from
        	tbl_board
        where rownum <= 20
    )
where rn > 10;

이를 통해서 2페이지만 추출할 수 있습니다.

 

이를 마이바티스로 처리해봅시다. 

 

우선 페이지와 글 개수를 넘기기 위한 Criteria 클래스를 작성합시다.

이는 pageNum과 amount를 같이 전달하는 용도입니다.

package com.jeongchan.domain;

import org.springframework.web.util.UriComponentsBuilder;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {
	private int pageNum; // 페이지 번호
	private int amount; //한 페이지당 데이터 개수
	
	
	public Criteria() {
		this(1,10); //기본 값을 1페이지 10개로 지정
	}
	
	public Criteria(int pageNum,int amount) {
		this.pageNum = pageNum;
		this.amount = amount;
	}
}

그 다음 마이바티스 매퍼와 인터페이스를 작성합시다.

페이징을 적용할 수 있도록 getListWithPaging메소드를 작성합시다.

public List<BoardVO> getListWithPaging(Criteria cri);
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
	<![CDATA[
          select
              bno,title, content
          from
              (
                  select /*+INDEX_DESC(tbl_board pk_board)*/
                      rownum rn, bno, title, content
                  from
                      tbl_board
                  where rownum <= 20
              )
          where rn > 10
    ]]>
</select>

여기서 20이 해당하는 값은 pageNum과 amount를 곱한 값으로 끝번호입니다. 10은 pageNum에서 1을 뺀값에 amount를 곱한 값으로 시작번호입니다. 즉 11번부터 20번까지이므로 2페이지에 해당합니다.

 

이를 파라미터로 전달된 것을 활용하여 마이바티스 구문을 다시 작성합시다.

<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
	<![CDATA[
          select
              bno,title, content
          from
              (
                  select /*+INDEX_DESC(tbl_board pk_board)*/
                      rownum rn, bno, title, content
                  from
                      tbl_board
                  where rownum <= #{pageNum} * #{amount}
              )
          where rn > (#{pageNum}-1) * #{amount}
    ]]>
</select>

다음은 페이징 화면 처리에 대해서 알아보도록 하겠습니다.

' > Spring' 카테고리의 다른 글

Spring 이론(응용) - 검색 처리  (0) 2019.08.19
Spring 이론(응용) - ORACLE 페이징처리  (0) 2019.08.17
Spring 이론(재) - 스프링 기본 구성  (0) 2019.07.22
Spring 이론(재) - AOP  (0) 2019.07.21
Spring 이론(재) - controller  (0) 2019.07.20