본문 바로가기

Java, Spring/20일

20일차 2

게시판 페이징 기능을 추가해보자.

 

쿼리를 만들어보자.

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