본문 바로가기

Study/Spring

스프링 게시판 만들기 - 페이징 - 필요 없는 페이지 번호 문제 해결

나는 스프링 게시판 만들기(by kuzuro)를 따라서 게시판 프로젝트를 만들고있다.

정말 설명이 잘 되어있는 튜토리얼이라서 감사히 공부하고 있는데.. 페이징을 구현하다가 간단한 오류를 발견해서 원인을 찾고 수정하는 과정을 기록해 보려고 한다.

어떤 오류인가?

왼쪽은 페이징을 구현한 목록이고 오른쪽은 게시판 테이블의 게시글 갯수, 총 30개이다.

한 페이지당 10개의 글이 노출되도록 한 상태이기 때문에 1, 2, 3번의 페이지가 만들어지고 4, 5, 다음 페이지는 없어야 한다.

그런데 4, 5, 다음 페이지로 접근하게 하는 요소가 html에 만들어지고 있다.

필요없는 페이지 번호가 노출되는 문제..정도로 오류의 이름을 정해 보았다.

참고로, 해당 페이지들에 접근하면 아래와 같이 아무런 글도 나타나지 않는 화면을 보여주고 있다.

코드에서 원인을 찾고 해결해보자

		// 마지막 번호
		endPageNum = (int) (Math.ceil((double) num / (double) pageNum_cnt) * pageNum_cnt);

		// 시작 번호
		startPageNum = endPageNum - pageNum_cnt + 1;

		// 마지막 번호 재계산
		int endPageNum_tmp = (int) (Math.ceil((double) count / (double) pageNum_cnt));

		if (endPageNum > endPageNum_tmp) {
			endPageNum = endPageNum_tmp;
		}

		prev = startPageNum == 1 ? false : true;
		next = endPageNum * pageNum_cnt >= count ? false : true;

노출시킬 페이지 번호를 계산하는 부분의 코드이다.

endPageNum으로 현재 노출할 '마지막 페이지 번호'가 몇 번인지 계산한다.

num은 현재 페이지 번호, pageNum_cnt는 한번에 표시할 페이징 번호 갯수이다 (나의 경우 5로 설정)

위의 예시로 이해하자면 endPageNum은 10, num은 6, pageNum_cnt는 5다.

 

각 변수의 의미를 이해했다면, 이제 위의 코드에서 endPageNum을 계산하는 라인을 이해해보자.

예를 들어, 현재 내가 보고 있는 페이지가 6번 페이지일 경우 6/5를 올림하면 2, 2에 5를 곱해 현재 노출할 마지막 페이지 번호가 10번 페이지인 것을 알 수 있다.

startPageNum은 현재 노출할 '시작 페이지 번호'가 몇 번인지 계산한다.

위의 예시에 이어서, 마지막 페이지가 10번일 경우 10에서 한번에 표시할 페이징 번호 갯수인 5를 빼고, 거기에 1을 더해서 시작 페이지 번호가 6이라는 것을 알 수 있다.

마지막 번호 재계산이 필요한 이유는 (위의 예시에 이어서) 10번(혹은 9번.. 8번..) 페이지에 표시할 게시글이 없을 경우이다. 한 페이지당 10개의 글을 나타낼 수 있는 게시판이라면 총 71개의 글이 있을 경우 8개의 페이지만 필요하다.

전체 게시글 수(=71) 한 페이지에 노출할 글 갯수(=10)로 나눈 값(=7.1)을 올림(=8)하면 몇 개의 페이지가 필요한지 구할 수 있다.

int endPageNum_tmp = (int) (Math.ceil((double) count / (double) pageNum_cnt));

코드를 다시 보자. 계산에 잘못된 부분이 있다.

pageNum_cnt는 한 페이지에 노출할 글 갯수가 아닌 한번에 표시할 페이징 번호의 갯수이다.

이 부분을 한 페이지에 노출할 글 갯수에 해당하는 postNum으로 수정하였다.

아직 기존 코드에서 수정할 부분이 하나 더 있다.

next = endPageNum * pageNum_cnt >= count ? false : true;

페이징에서 [다음] 버튼을 노출 시킬지 말지 관리하는 next변수의 값을 계산하는 부분이다.

endPageNum과 (pageNum_cnt로 잘못 지정된)어떤 값을 곱하여 그 값이 전체 글의 갯수 이상이라면 false를, 미만일 경우에는 true를 할당해준다. 마지막 페이지 번호와 pageNum_cnt를 곱해봤자 아무런 도움이 안 된다.

이 부분의 pageNum_cnt 또한 postNum으로 수정한다. 마지막 페이지 번호와 한 페이지에 출력할 게시물 갯수를 곱하여 [다음]으로 나타낼 페이지가 남았는지, 아닌지 확인할 수 있다.