오라클 데이터베이스 페이징 처리
페이징 처리 시 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 |