Spring MVC_basic.8 Criteria와 pageMaker 를 이용한 페이징 준비

dwanGim·2022년 6월 13일
0

spring_basic

목록 보기
7/41

페이지를 만들기 위한 준비물

저번에 위와 같은 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();
	}
	
}
profile
배울 게 참 많네요.

0개의 댓글