게시판 페이징 기능을 추가해보자.
쿼리를 만들어보자.
select seq, title from board order by seq desc;
SEQ TITLE --- ------- 37 스페인 33 독일 24 일본 23 아르헨티나 22 한국 20 포르투칼 19 잉글랜드 18 이탈리아 15 스페인 9 닥치고 정치 7 아빠엄마 6 아이폰 3 문제는 경제다
이렇게 번호가 띄엄띄엄이고 역순일 경우 그 페이지에 해당하는 10개를 가져오는 것은 어려워.
가상의 번호(rownum)를 붙여보자
select rownum, seq, title from board order by seq desc;
ROWNUM SEQ TITLE ------ --- ------- 1 37 스페인 2 33 독일 3 24 일본 4 23 아르헨티나 5 22 한국 6 20 포르투칼 7 19 잉글랜드 8 18 이탈리아 9 15 스페인 10 9 닥치고 정치 11 7 아빠엄마 12 6 아이폰 13 3 문제는 경제다
10개씩 가져오는 게 가능해보이는군
첫번째 페이지를 가져와 보자.
select rownum, seq, title from board where 1 <= rownum and rownum <= 10 order by seq desc;
ROWNUM SEQ TITLE ------ --- ------ 1 37 스페인 2 33 독일 3 24 일본 4 23 아르헨티나 5 22 한국 6 20 포르투칼 7 19 잉글랜드 8 18 이탈리아 9 15 스페인 10 9 닥치고 정치
이렇게 하면 첫페이지의 10개를 가져올 수 있네.
.
.
.
잠깐 테스트를 위해 데이터를 많이 넣어보자.
command창 띄워서
begin for i in 1..1000 loop insert into board (seq, title, name, password, content) values (boardseq.nextval, '난 알아요', '서태지', '1111', '이 밥이흐르고 흐르면'); end loop; end;
데이터 1000건이 추가됐어.
.
.
.
이제 두 번째 페이지를 가져와 보자.
select rownum, seq, title from board where 11 <= rownum and rownum <= 20 order by seq desc;
ROWNUM SEQ TITLE ------ --- -----
왜 안나오지? 우선순위 때문이지.
FROM절, WHERE절, GROUP BY절, SELECT, HAVING절, ORDER BY 절 순서잖아.
SELECT에서 ROWNUM이 붙는데 WHERE절은 그 전에 수행되잖아.
그래서 인라인쿼리를 이용한다.
select A.* from (select rownum, seq, title from board) A --order by 가 없으니까.. where 1 <= rownum and rownum <= 10 order by seq desc;
ROWNUM SEQ TITLE ------ --- ------- 1 37 스페인 10 33 독일 2 20 포르투칼 9 19 잉글랜드 8 18 이탈리아 7 15 스페인 4 9 닥치고 정치 6 7 아빠엄마 5 6 아이폰 3 3 문제는 경제다
안의 쿼리에 ORDER BY 가 없으니 값이 이상하게 나오지.
그러니까 처음부터 ORDER BY를 해놔야지.
select A.* from (select rownum, seq, title from board order by seq desc) A where 1 <= rownum and rownum <= 10 order by seq desc;
ROWNUM SEQ TITLE ------ ---- ----- 1 1037 난 알아요 2 1036 난 알아요 3 1035 난 알아요 4 1034 난 알아요 5 1033 난 알아요 6 1032 난 알아요 7 1031 난 알아요 8 1030 난 알아요 9 1029 난 알아요 10 1028 난 알아요
다시 두번째 페이지 볼면
select A.* from (select rownum, seq, title from board order by seq desc) A where 11 <= rownum and rownum <= 20;
ROWNUM SEQ TITLE ------ --- -----
안나오네. 왜지? 실은 잘 가져왔는데 SELECT하는 순간 ROWNUM이 다시 붙어버리기 때문이야.
이렇게 수정하자.
SELECT B.* FROM ( SELECT rownum as rnum, A.* FROM (SELECT seq, title, name, to_char(writeday,'YYYY/MM/DD') AS writeday, readcount FROM board ORDER BY seq DESC) A) B WHERE 11 <= rnum AND rnum <= 20; SELECT A.* FROM ( SELECT ROWNUM AS rnum, seq, title, name, TO_CHAR(writeday,'YYYY/MM/DD') AS writeday, readcount FROM board ORDER BY seq DESC) A WHERE 11 <= rnum AND rnum <= 20;
RNUM SEQ TITLE NAME WRITEDAY READCOUNT ---- ---- ----- ---- ---------- --------- 11 1027 난 알아요 서태지 2012/07/03 0 12 1026 난 알아요 서태지 2012/07/03 0 13 1025 난 알아요 서태지 2012/07/03 0 14 1024 난 알아요 서태지 2012/07/03 0 15 1023 난 알아요 서태지 2012/07/03 0 16 1022 난 알아요 서태지 2012/07/03 0 17 1021 난 알아요 서태지 2012/07/03 0 18 1020 난 알아요 서태지 2012/07/03 0 19 1019 난 알아요 서태지 2012/07/03 0 20 1018 난 알아요 서태지 2012/07/03 0
ROWNUM이 다시 발생하지 않게 ROWNUM에 column alias를 붙여줘.
이제 우리가 원하는 결과를 얻을 수 있어.
.
.
.
.
.
이 쿼리를 boardQuery.xml에 넣어줘야지.. 계속.
'Java, Spring > 20일' 카테고리의 다른 글
20일차 3 (0) | 2012.09.20 |
---|