구코단의 쿠키입니다.
질문하시는 내용 중에 오라클로 페이징 처리와 관련해서 문의하시는 분들이 있으셔서 블로그에 정리해 놓도록 하겠습니다.
게시판 생성 SQL문입니다.
create table tbl_board (
bno number,
title varchar2(400) not null,
content varchar2(2000) not null,
writer varchar2(50) not null,
regdate date default sysdate,
viewcnt number default 0
);
create sequence seq_board;
alter table tbl_board add constraint
pk_board primary key (bno);
페이지 처리 기본
일반적으로 오라클의 경우는 페이징 처리에 rownum을 활용합니다. rownum은 테이블에서 데이터가 출력될 때 붙는 번호라고 이해하시면 좋습니다.
rownum은 출력되면서 붙는 번호이기 때문에 어떤 식으로 SQL문이 실행되는지에 따라서(실행 계획)에 붙는 번호가 달라지게 됩니다.
위의 SQL의 경우는 오라클의 힌트를 이용해서 역순으로 데이터를 조회하는 예입니다. 이 경우 pk_board는 PK의 이름으로 해석하자면 pk_board를 역순으로 뒤지면서 데이터를 찾아내라는 뜻입니다.
rownum이 10보다 작거나 같기 때문에 10개의 데이터만 출력되는 것을 볼 수 있습니다.
2페이지 처리 하기
rownum은 데이터가 나오면서 붙여주는 번호이기 때문에 rownum > 10 and rownum <= 20과 같은 SQL문은 제대로 결과가 나오지 않습니다.
rownu > 10 구문에서 어떤 데이터가 나오면 rownum은 1이 되기 때문에 rownum > 10조건에 맞지 않기 때문에 건너뛰게 됩니다.
이러한 이유로 흔히 rownum은 반드시 1이 포함되어야 한다고 합니다.
2페이지를 처리하기 위해서는 'in-line view'라는 기술을 알아야만 합니다. in-line view는 쉽게 말해서 from 구문에 다른 SQL문이 들어간 형태입니다.
2페이지의 데이터 처리는 다음과 같습니다.
SQL문을 자세히 보면 from 내부에 SQL문이 하나 더 사용되는 것을 볼 수 있습니다.
위의 SQL문은 rownum이 20보다 작거나 같은 데이터(2페이지까지의 모든 데이터)를 in-line view로 처리하고, rn이라는 컬럼을 만들어 냅니다.
외부에서는 rn컬럼의 값이 10보다 크다는 조건을 이용합니다.
위의 결과와 비교해 보면 2페이지의 데이터가 출력되는 것을 볼 수 있습니다.
MyBatis의 SQL문
MySQL의 limit의 경우 사용하기 쉽지만, 오라클의 경우는 조금 복잡하므로 페이징 처리와 관련한 SQL문은 아래와 같은 형태로 수정되어야 합니다.
작성된 SQL문은 PART 2의 예제에서 다음과 같이 출력되어야 합니다.