생성자를 통해 전체 게시물 개수
, 현재 페이지 번호
, 한 페이지 당 게시물 개수
가 주어지면 전체 페이지 개수
, 시작 페이지 번호
, 끝 페이지 번호
, 이전 & 다음 화살표 표시 여부
가 차례로 정해진다.
전체 게시물 개수
, 한 페이지 당 게시물 개수
전체 게시물 개수
/ 한 페이지 당 게시물 개수
가 나머지 없이 나눠 떨어진다면 전체 페이지 개수를 구할 수 있다. 하지만 나눠 떨어지지 않는 경우는 어떨까? 단순히 1을 더하면 될 거 같지만 이때는 나머지 없이 나눠 떨어지는 경우에 부합하지 않는다.
예) 한 페이지 당 게시물 개수
가 5
인 경우
(1) `전체 게시물 개수`가 `1`, `2`, `3`, `4`, `5`인 경우에는 페이지가 `1`개가 필요
(2) `전체 게시물 개수`가 `6`, `7`, `8`, `9`, `10`인 경우에는 페이지가 `2`개가 필요
(3) `전체 게시물 개수`가 `11`, `12`, `13`, `14`, `15`인 경우에는 페이지가 `3`개가 필요
...
전체 게시물 개수
가 한 페이지 당 게시물 개수
의 배수가 되는 시점에 필요한 페이지의 개수가 올라가는 것을 확인할 수 있다. 따라서 한 페이지 당 게시물 개수
로 나눈 몫이 일정해야 한다. 하지만 1
, 2
, 3
, 4
의 경우는 0
이지만 5
혼자만 1
이다. 0
부터 4
까지는 몫이 0
이기 때문에 전체 게시물 개수
에서 1
을 빼준다.
((전체 게시물 개수) - 1) / (한 페이지 당 게시물 개수) + 1
현재 페이지 번호
, 한번에 표시할 페이지 개수
, 전체 페이지 개수
예) 현재 페이지 번호
가 17
이고 한번에 표시할 페이지 개수
가 5
인 경우
(1, 2, 3, 4, 5), (6, 7, 8, 9, 10), (11, 12, 13, 14, 15), (16, 17, 18, 19, 20), ...
전체 페이지 개수
를 구하는 식과 비슷하게 한번에 표시할 페이지 개수
로 묶었을 때 끝 번호가 구하고자 하는 끝 페이지 번호가
된다. 나누어 떨어지는 경우만 몫이 증가하는 형태로 규칙이 깨지기 때문에 마찬가지로 1
을 빼준다.
(((현재 페이지 번호) - 1) / (한번에 표시할 페이지 개수) + 1) * 한번에 표시할 페이지 개수
하지만 전체 페이지 개수
가 끝 페이지 번호
보다 작은 경우 끝 페이지 번호
는 전체 페이지 개수
가 된다.
if (this.totalPages < this.endPage)
this.endPage = this.totalPages;
끝 페이지 번호
와 비슷한 방법으로 구할 수 있다.
((현재 페이지 번호) - 1) / (한번에 표시할 페이지 개수) + 1
시작 페이지 번호
가 1
인 경우에만 표시하지 않고 나머지는 모두 표시한다.
끝 페이지 번호
가 전체 페이지 개수
인 경우에만 표시하지 않고 나머지는 모두 표시한다.
package com.portfolio.www.util;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class Pagination {
private int totalPosts; // 전체 게시글 개수
private int currentPage; // 현재 페이지 번호
private int postsPerPage; // 한 페이지 당 게시글 개수
public static int DISPLAY_PAGE_NUM = 10; // 한 페이지 당 출력할 게시글
private int totalPages; // 전체 페이지 개수
private int startPageNum; // 시작 페이지 번호
private int endPageNum; // 끝 페이지 번호
private boolean isPrev; // 이전 화살표 표시 여부
private boolean isNext; // 다음 화살표 표시 여부
public Pagination(int totalPosts, int currentPage, int postsPerPage) {
this.totalPosts = totalPosts;
this.currentPage = currentPage;
this.postsPerPage = postsPerPage;
setTotalPages();
setStartPageNum();
setEndPageNum();
setIsPrev();
setIsNext();
}
public void setTotalPages() {
this.totalPages = ((this.totalPosts - 1) / this.postsPerPage) + 1;
}
public void setStartPageNum() {
this.startPageNum = ((this.currentPage - 1) / DISPLAY_PAGE_NUM) * DISPLAY_PAGE_NUM + 1;
}
public void setEndPageNum() {
this.endPageNum = (((this.currentPage - 1) / DISPLAY_PAGE_NUM) + 1) * DISPLAY_PAGE_NUM;
if (this.totalPages < this.endPageNum)
this.endPageNum = this.totalPages;
}
public void setIsPrev() {
this.isPrev = (this.startPageNum == 1) ? false : true;
}
public void setIsNext() {
this.isNext = (this.endPageNum == this.totalPages) ? false : true;
}
}