게시물 목록 화면과 페이징 - 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)를 구할 수 있다. 

 


출처 : 스프링의 정석 : 남궁성과 끝까지 간다

 

 

+ Recent posts