1. 게시물 목록 페이징


화면에 현재 페이지 정보가 필요하다.
2. LIMIT [offset, ] row_count(읽어올 row의 수)
- 테이블에 들어있는 데이터를 페이지별로 가져오려면 select문의 LIMIT 사용

Limit 10, 10을 주면, 데이터 전체에서 10번째 행을 건너뛰고 11번째 행부터 row_cnt가 10이니 10개를 읽어온다.
| page | offset |
| 1 | 0 |
| 2 | 10 |
| 3 | 20 |
| 4 | 30 |
| ... | ... |
만약 1페이지를 읽어온다면 offset은 0(첫번째 줄부터 읽어오니까)
2번째 페이지를 읽어온다면 offset은 10.. 이런식으로 가져와야한다.
그러면 어떤 페이지 값이 있을 때 offset을 어떻게 결정할까?
| page | page-1 | (page-1)*10 |
| 1 | 0 | 0 |
| 2 | 1 | 10 |
| 3 | 2 | 20 |
| 4 | 3 | 30 |
| ... | ... | ... |
두 값을 비교해보면 값이 하나씩 줄어든다.
그래서 이 패턴은 page - 1이 답이다. (page-1)*10을 함으로써 offset을 계산할 수 있다.
<실습>
- PageHandler 클래스 생성
public class PageHandler {
int totalCnt; // 총 게시물 갯수
int pageSize; // 한 페이지의 크기
int naviSize = 10; // 페이지 내비게이션의 크기
int totalPage; // 전체 페이지의 갯수
int page; // 현재 페이지
int beginPage; // 내비게이션의 첫번째 페이지
int endPage; // 내비게이션의 마지막 페이지
boolean showPrev; // 이전 페이지로 이동하는 링크를 보여줄 것인지의 여부
boolean showNext; // 다음 페이지로 이동하는 링크를 보여줄 것인지의 여부
public PageHandler(int totalCnt, int page) {
this(totalCnt, page, 10);
}
public PageHandler(int totalCnt, int page, int pageSize) {
this.totalCnt = totalCnt;
this.page = page;
this.pageSize = pageSize;
totalPage = (int)Math.ceil(totalCnt / (double)pageSize); // 남으면 페이지가 하나 더 필요해서 올림
beginPage = page / naviSize * naviSize + 1;
endPage = Math.min(beginPage + naviSize -1 , totalPage); // totalPage보다 작을 수 있으니 Math.min 사용해서 둘 중 작은 수 사용
showPrev = beginPage != 1;
showNext = endPage != totalPage;
}
// 페이지 내비게이션을 print하는 메서드
void print() {
System.out.println("page = " + page);
System.out.print(showPrev ? "[PREV] " : ""); // 참이면 이전페이지 가는 링크
for(int i = beginPage; i <= endPage; i++) {
System.out.print(i + " ");
}
System.out.println(showPrev ? "[Next] " : "");
}
@Override
public String toString() {
return "PageHandler{" +
"totalCnt=" + totalCnt +
", pageSize=" + pageSize +
", naviSize=" + naviSize +
", totalPage=" + totalPage +
", page=" + page +
", beginPage=" + beginPage +
", endPage=" + endPage +
", showPrev=" + showPrev +
", showNext=" + showNext +
'}';
}
다음으로 테스트 진행을 위해 테스트 클래스 PageHandlerTest생성.


테스트가 잘 통과한 것을 확인할 수 있다. 다른 테스트도 수행해보자.

잘 수행된다.
경계값을 잘 확인해서 테스트를 수행하면 좋다.
'Spring' 카테고리의 다른 글
| ch4 05. 게시판 읽기, 쓰기, 삭제, 수정 기능 구현(1) (0) | 2023.03.21 |
|---|---|
| ch4 04. 게시판 목록 만들기와 페이징 - TDD (2) (0) | 2023.03.17 |
| ch04 02. Mybatis로 DAO 작성하기 (0) | 2023.03.16 |
| ch4 01. MyBatis의 소개와 설정 (0) | 2023.03.16 |
| ch3 21. 서비스 계층의 분리와 @Transactional(3) (0) | 2023.03.15 |