studyplan

페이지네이션 , Pagination 만들어지는 과정 1 본문

스프링

페이지네이션 , Pagination 만들어지는 과정 1

무한머니 2022. 7. 27. 15:22

페이지 정보를 담을 page class 를 만든다 

 

현재 페이지 값인 pageNum , 현재 페이지의 값을 담을 amount 

 

기본적으로 들어갈 페이지 갯수 , 맨처음에 나올 화면 세팅 

 

setPageNum 

setAmount

 

2. 페이지 메이커를만든다 

 

일단 PAGE_COUNT 라는 상수를 만들고 10 이라는 값을 준다 

시작값 끝값을 정하는 필드 beginPage, endPage 를 만든다  

이전페이지 다음페이지 버튼을 활성화 시킬 //

boolean 타입의 prev , next 만들어준다 

 

그리고 Page 클래스를 주입받아서 page 객체를 생성하고 

총 게시물 수를 세는 totalCount 필드를 만들어준다 

 

// PageMaker 생성자에는 

값이 2개가 들어가는데 

주입 받은 Page page 와 , totalCount 기본으로 넣어주고 

나머지는  makePageInfo() 라는 메서드로 계산해서 값을 넣어준다 

 

 

makePageInfo() 는 

맨처음은 

끝 값을 먼저 구해주고 그 값을 통해서 나머지 값들을 정해준다 

this.endPage = (int) Math.ceil(page.getPageNum() / (double) PAGE_COUNT) * PAGE_COUNT;

this.endPage = (int) Math.ceil(page.getPageNum() / (double) PAGE_COUNT) * PAGE_COUNT;

끝값 = (int 인트로 변환 )  Math.ceil(올림) (page.getPageNum() 현재 페이지수  / (double 소수점) 한화면에 배치할 페이지수 !)  * 한 화면에 배치할 페이지 수  = 

 

한 화면에 배치할 페이지 수 = 10 개씩 !!

여기서 endPage 값은 10 , 20 을 말하는것인데 

이 그림의 경우 계산이 

this.endPage = (int) Math.ceil(1 / (double)10) * 10 이된다 

이걸 계산하면  

this.endPage = (int) Math.ceil(0.1) * 10

this.endPage = (int) 1.0 * 10

this.endPage = 10 이된다 

위 그림의 경우 계산이

this.endPage = (int) Math.ceil(11 / (double)10) * 10 이된다 

이걸 계산하면  

this.endPage = (int) Math.ceil(1.1) * 10

this.endPage = (int) 2.0 * 10

this.endPage = 20 이된다 

 

이렇게 endPage 를 구하면 

beginPage 를 구할수 있게 되는데 

this.beginPage = endPage - PAGE_COUNT + 1;

this.beginPage = endPage - PAGE_COUNT + 1; 이런 공식을 대입하면 

첫번째 경우 

this.beginPage = 10 - 10 + 1;

this.beginPage =  1 이 되고 

두번째 경우 

this.beginPage = 20 - 10 + 1;

this.beginPage =  11 이 된다

 

 

앞에서처럼 값이 떨어지는 경우라면 저런 공식으로도 가능하지만 

총 게시물이 237 개라면 

10 개 짜리 페이지 2 개와 4개짜리 페이지가 필요하다 그래서 마지막 페이지 수를 보정해줄 realEnd 공식이 필요하다 

 

int realEnd = (int) Math.ceil(totalCount / (double) page.getAmount());

int realEnd = (int) Math.ceil(totalCount / (double) page.getAmount());

int realEnd = (int) Math.ceil(총 게시물수  / (소수점 변환) 한 페이지당 보여줄 게시물 수 ! 

int realEnd = (int) Math.ceil(237 / 10.0)

int realEnd = (int) Math.ceil(23.7)

int realEnd = (int) 24.0

int realEnd = 24 

이런 결과가 나온다 

 

하지만 2가지 모두 쓸수 없기 때문에 경우를 나눠줘야 한다 

총 게시물 수가 237 개라면 

this.endPage = (int) Math.ceil(21 / (double) 10) *10

this.endPage = (int) 3.0 *10

this.endPage = 30 이고 

 

int realEnd = (int) Math.ceil(237 / 10.0)

int realEnd = (int) Math.ceil(23.7)

int realEnd = (int) 24.0

int realEnd = 24 

이렇게 숫자가 달라진다 

왠만하면 .. realEnd가 많이 나오긴 한다 

 

마지막으로 앞으로갈지 뒤로갈지 정해주는 prev , next 는 

이런 공식이 필요한데 

말 그대로 ,, 

이전으로 가려면 무조건 1보다는 커야 .. 뒤로 갈것이고 

next 는 왠만하면 있는데 

 

이렇게 .. 

andPage가 40 이고 

realEnd가 32 이면 .. 성립 할수가 없다 

Comments