Burninghering's Blog
article thumbnail

게시물이 너무 많을 때 페이지 별로 나눠놓고, 페이지 네비게이션을 통해 게시물을 편리하게 볼 수 있도록 하는 것 

 

테이블에 들어있는 데이터를 페이지별로 가져오려면 SELECT문의 LIMIT이라는 구문을 사용해야 한다.

offset이란, 처음부터 빨간 네모까지 얼마나 떨어져 있는가? 이고

row_count는 읽어올 row의 수 이다.

 

첫 번째 페이지의 offset은 0

두 번째 페이지의 offset은 10..

 

offset을 만드는 방법이 어려우므로, 

일단 page-1을 해보면 page보다 하나씩 줄어드는 것을 알 수 있다.

거기다가 *10을 하면 offset을 계산할 수 있다.

 

package com.fastcampus.ch4.domain;

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){ //2개의 변수만 줬을 때에는, pageSize를 10으로 준다
        this(totalCnt,page,10);
    }
    public PageHandler(int totalCnt,int page, int pageSize){ //페이징 계산하는데 필요한 변수3개로 생성자 만들기
        this.totalCnt=totalCnt;
        this.page=page;
        this.pageSize=pageSize;

        totalPage = (int)Math.ceil(totalCnt/pageSize); //Math.ceil=올림, double로 나오므로 int화
        beginPage = page/naviSize*naviSize+1; //일의 자릿수를 버리기
        endPage = Math.min(beginPage + naviSize -1 ,totalPage);
        showPrev=beginPage!=1; //beginPage가 1만 아니면 된다.(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]" : "");
    }

    @Override
    public String toString() {
        return "PageHandler{" +
                "totalCnt=" + totalCnt +
                ", pageSize=" + pageSize +
                ", naviSize=" + naviSize +
                ", totalPage=" + totalPage +
                ", page=" + page +
                ", beginPage=" + beginPage +
                ", endPage=" + endPage +
                ", showPrev=" + showPrev +
                ", showNext=" + showNext +
                '}';
    }
}

 

Test를 만든다

package com.fastcampus.ch4.domain;

import org.junit.Test;

import static org.junit.Assert.*;

public class PageHandlerTest {
    @Test
    public void test(){
        PageHandler ph = new PageHandler(250,11);
        ph.print();
        System.out.println("ph = "+ph);
        assertTrue(ph.beginPage==11);
        assertTrue(ph.endPage==20);
    }

}

 

@Test
public void test3(){
    PageHandler ph = new PageHandler(255,25);
    ph.print();
    System.out.println("ph = "+ph);
    assertTrue(ph.beginPage==21);
    assertTrue(ph.endPage==26);
}

profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.