게시물 목록 화면과 페이징 - TDD
페이지 목록을 보여주는데 필요한 값으로 offset과, row_count이 있다.
offset은 페이지 목록중에 앞에 있는 몇개의 게시물을 건너뛰고 보여줄지 정하는 값이고
row_count는 한 번에 보여줄 게시물 목록의 수이다.
offset이 필요한 이유)
만약 게시물이 99개 있고 row_count를 10이라고 가정했을때 1페이지당 10개의 게시물 목록이 나타난다.
그래서 총 페이지는 10페이지(10개의 게시물로 구성된 9페이지) + (9개의 게시물로 구성된 1페이지)가 되는데,
내가 3페이지를 보고 싶으면 앞에 20개의 게시물을 건너뛰고 그 다음의 10개의 게시물을 보여주게 된다.
package com.fastcampus.ch4.domain;
public class PageHandler {
private int totalCnt; // 총 게시물 갯수
private int pageSize; // 한 페이지의 크기
private int naviSize = 10; // 페이지 내비게이션의 크기
private int totalPage; // 전체 패이지의 갯수
private int page; // 현재 페이지
private int beginPage; // 내비게이션의 첫 번째 페이지
private int endPage; // 내비게이션의 마지막 페이지
private boolean showPrev; // 이전 페이지로 이동하는 링크를 보여줄 것인지의 여부
private 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-1) / naviSize * naviSize + 1;
endPage = Math.min(beginPage + naviSize - 1, totalPage);
showPrev = beginPage != 1;
showNext = endPage != totalPage;
}
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(showNext ? "[NEXT]" : "");
}
}
PageHandler를 만들면 다음과 같다.
페이지 목록을 어떻게 구성할지 잘 생각해야 한다.
먼저 총 게시물의 갯수를 알고(totalCnt), 한 페이지에 몇개의 게시물을 보여줄건지(pageSize)를 정하면 총 몇 페이지가 나올지 계산할 수 있다(totalPage).
페이지 수를 Navigation에서 몇 페이지씩 표시할건지(naviSize) 정하고, 내 현재 페이지를 통해
Navigation의 첫 번째 페이지(beginPage), 마지막 페이지(endPage), 이전 페이지 링크 존재 여부(showPrev), 다음 페이지 링크 존재 여부(showNext)를 구할 수 있다.
출처 : 스프링의 정석 : 남궁성과 끝까지 간다
'Spring & SpringBoot > Spring 복습' 카테고리의 다른 글
[Chapter 2] Spring MVC (9강 ~ 19강) (0) | 2022.07.27 |
---|---|
[Chapter 2] Spring MVC (1강~8강) (0) | 2022.07.26 |
[Chapter 3] 18강~21강, [Chapter 4] 1~2강 (0) | 2022.07.11 |
[Chapter 3] Spring DI와 AOP 9강 ~ 17강 (0) | 2022.07.09 |
[Chapter 3] Spring DI와 AOP 1강~8강 (0) | 2022.07.08 |