페이지를 만들기 위한 준비물
저번에 위와 같은 oracle 구문을 통해
5페이지를 원한다면 pagenum을 바꿈으로서
원하는 rownum을 row마다 부여해
10개씩 row를 불러올 수 있다는 걸 깨달았습니다.
그렇다면 이제 페이지 버튼과 페이지를 마음껏 설정할 수 있도록
필요한 변수들을 저장해놓아야 합니다.
com.ict.persistence 내부에
Criteria와
PageMaker를 생성했습니다.
둘은 페이지네이션에 필요한 변수를 getBoardList 메서드에
보내주는 역할을 하게될 것 입니다.
package com.ict.persistence;
import lombok.Data;
@Data
public class Criteria {
private int page;
private int number = 10;
}
criteria는 sql구문에 필요한 page와 number를 선언했습니다.
그리고 pageMaker입니다.
pageMaker
먼저 페이징에 필요한 변수들을 선언합니다.
전체 테이블 갯수는 totalBoard
시작버튼의 페이지는 startPage
끝버튼의 페이지는 endPage
이전 페이지는 prev
다음 페이지는 next
얼마나 페이지를 보여줄지 선언하는 diplayPageNum
그리고 현재 조회 중인 페이지 정보를 획득하는 Criteria cri가
필요합니다.
그럼 이제 필요한 변수들이 선언되었으니
한번 페이지를 계산해보겠습니다.
10 페이지씩 보여주기 위해 displayPageNum을 10으로 초기화합니다.
끝페이지 구하기
this.endPage = (int)(Math.ceil(cri.getPage() / (double)displayPageNum) * displayPageNum);
만약 5페이지를 조회 중이라고 했을 때.
cri.getPage() = 5를
10으로 나눈 뒤 소수점 있을 때 무조건 반올림을 시켜주는
Math.ceil을 걸고 정수화를 시켜줍니다.
왜냐면 3페이지를 보든 8페이지를 보든 10페이지를 보든
끝페이지는 10페이지이고
11페이지부터 다음 페이징 번호로 넘어가야 하기 때문입니다.
이렇게 10.0으로 나누고 ceil을 건 뒤 10을 곱해주면
현재 조회 중인 페이지가 11일 때는 20
34일 때는 40
이런 식으로 끝페이지를 구해줄 수 있습니다.
이걸 처음 생각해낸 사람은
정말 똑똑한 사람인 것 같아요.
시작 페이지 구하기
계속 여전히 5페이지를 조회 중이라고 했을 때
시작 페이지는 간단하게
끝페이지 - 페이지 개수 + 1을 하면 됩니다.
총 끝페이지 설정
int tempEndPage = (int)(Math.ceil(totalBoard / (double)cri.getNumber()));
if(endPage > tempEndPage) {
endPage = tempEndPage;
}
만약 총 글 개수가 74개인데
끝페이지 버튼이 10까지 있는 건 말이 안 된다.
7페이지에서 마지막 페이지라는 걸 명시하기 위해
위과 같이 int tempEndPage를 선언하여
끝페이징을 마친다.
이전페이지로 / 다음페이지로
this.prev = this.startPage == 1 ? false : true;
this.next = this.endPage * cri.getNumber() >= totalBoard ? false : true;
위와 같이 삼항연산을 통해
이전으로의 boolean 값이 만약 1페이지가 시작페이지일 때는 false
다음으로의 boolean 값이 만약 모든 글이 끝나는 마지막 페이지 일때는
false
를 주도록해서 이전과 다음 단추가 보이지 않도록 합니다.
totalBoard 메서드
마지막으로 totalBoard를 정의하는 setTotalBoard 메서드를
선언합니다.
Long totalBoard를 받아 totalBoard를 그때그때 정의하고
지금껏 작성한 calcDate()메서드를
다시 실행하도록 합니다.
이제 완벽합니다.
좋습니다.
일단은 여기까지 입니다.
pageMaker 코드 전문
package com.ict.persistence;
import lombok.Data;
@Data
public class PageMaker {
private Long totalBoard;
private int startPage;
private int endPage;
private boolean prev;
private boolean next;
private int displayPageNum;
// 현재 조회중인 페이지 정보를 획득하기 위해 선언
private Criteria cri;
public void calcData() {
this.displayPageNum = 10;
// 끝나는 페이지는 소속 번호를 실수 10으로 나눈다음 다시 올림처리후 10을 곱해 구할 수 있다.
this.endPage = (int)(Math.ceil(cri.getPage() / (double)displayPageNum) * displayPageNum);
// 시작페이지는 끝나는페이지 - 페이지개수 +1을 하면 된다.
this.startPage = (this.endPage - this.displayPageNum) + 1;
int tempEndPage = (int)(Math.ceil(totalBoard / (double)cri.getNumber()));
if(endPage > tempEndPage) {
endPage = tempEndPage;
}
this.prev = this.startPage == 1 ? false : true;
this.next = this.endPage * cri.getNumber() >= totalBoard ? false : true;
}
public void setTotalBoard(Long totalBoard) {
this.totalBoard = totalBoard;
calcData();
}
}