페이징 : 한페이지에 일정 게시물만 보여주는 것.
스압.. ㅠ
SQL문으로 상위 10개의 게시물만 조회 하는 방법 부터 살펴볼게요~
ROWNUM은 가상의 칼럼
ROWNUM 은 BOARD_NO 와 같지 않다.
이거는 최신글이 아니다. 제일 오래된 글이 조회된다.
== 최신글 10개는 order by로.
2페이지 글은 WHERE ROWNUM BETWEEN 11 AND 20
3페이지 글은 WHERE ROWNUM BETWEEN 21 AND 30
.
.
.
n페이지 글은 WHERE ROWNUM BETWEEN (n-1) *10+ 1 AND n*10 이런 식이 되는데 또 문제가 있다고 합니다.
음.. 너무 복잡한뎅..
SELECT * => 3. 정렬후 rownum이 적용된 테이블에서 원하는 게시물 번호를 추출.
FROM (SELECT ROWNUM rn, v_board.* => 2. rownum 을 추출 하기 위한 서브 쿼리
FROM
(
SELECT *
FROM tbl_board
ORDER BY board_no DESC => 1. 정렬을 위한 서브쿼리
) v_board)
WHERE rn BETWEEN 11 AND 20
;
레파지토리 구현체에서 전체조회 메서드의 쿼리문을 sql에서 실습했던 코드로 변경
서버 재실행 결과
최신글 10개만 출력이 되고 있다.
==> # 페이징 알고리즘
ex) 1페이지 클릭시 1~10 / 2페이지 클릭시 11 ~ 21 [10페이지씩 보기]
ex) 1페이지 클릭시 1~20 / 2페이지 클릭시 21 ~ 40 [20페이지씩 보기]
======
1페이지
1 ~ 10 [ (1-1) *10 +1 ~ 1*10 ]
2 페이지
11 ~ 20 [ (2-1)*10 +1 ~ 2*10 ]
3페이지
21 ~ 30 [ (3-1)*10 +1 ~ 3*10 ]
4페이지
31 ~ 40 [ (4-1) * 10 +1 ~ 4*10 ]
=========
★ 클라이언트가 한페이지에 몇개씩 볼 것인지에 대한 정보 보관이 필요.
클래스 활용.
1. 페이지 클래스를 만든다.
레파지토리 구현체의 전체조회 메서드에 파라미터로 page 클래스 설정
레파지토리 인터페이스에서 이름이 같은 메서드가 있으므로 오버로딩 으로 메서드 추가.
오버로딩 완료
페이징 공식 도출
공식을 다시 살펴보면 pageNum 이 1페이지 일때 게시물수가 10개씩 나온다고 하면
1페이지에서는 1 ~ 10 번 게시물이
2페이지에서는 11 ~ 20 번 게시물이
.
.
.
레파지토리에서 쿼리문 마무리 하기
WHERE rn BETWEEN ? AND ? ;
? 들은 공식대로 하면 된다.
page.getPageNum() 으로 페이지 번호 추출 후 -1 하고
page.getAmount() 로 한페이지당 보여질 게시물의 수를 곱하고
더하기 1
(pageNum - 1) * amount + 1 ~ (pageNum*amount)
게시물 출력시 시작 = DB 에서 ROWNUM 으로 조회 된 것이 boardList에 매칭 되서
service 클래스를 거쳐 controller를 지나 jsp로 출력 된다.
==== 테스트 ===
테스트 완료
서비스 클래스에서 연결 하기.
== 테스트 할때 버벅됨.. ㅠㅠ
아.. 오타 amount를 amout로 써서 에효..
== 다음에 게시글에 이어서..