본문 바로가기

Spring

ch4 03. 게시판 목록 만들기와 페이징 - TDD (1)

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생성.

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

잘 수행된다. 

경계값을 잘 확인해서 테스트를 수행하면 좋다.