페이지네이션 (Pagination)

김학준·2024년 6월 17일
0

게시판

목록 보기
25/44

생성자를 통해 전체 게시물 개수, 현재 페이지 번호, 한 페이지 당 게시물 개수가 주어지면 전체 페이지 개수, 시작 페이지 번호, 끝 페이지 번호, 이전 & 다음 화살표 표시 여부가 차례로 정해진다.

전체 페이지 개수

  • 필요한 값: 전체 게시물 개수, 한 페이지 당 게시물 개수

전체 게시물 개수 / 한 페이지 당 게시물 개수가 나머지 없이 나눠 떨어진다면 전체 페이지 개수를 구할 수 있다. 하지만 나눠 떨어지지 않는 경우는 어떨까? 단순히 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;
	}
}

0개의 댓글