java, spring

[Spring] 페이징 화면 처리 - 1 -

isaac.kim 2021. 7. 17. 08:48
728x90
반응형

[Spring] 페이징 화면 처리 - 1 -

 

게시글이 나열되어 있는 목록 아래에 페이지 번호를 표시하고 사용자가 페이지 번호를 클릭하여 해당 페이지를 확인할 수 있게 처리해야 합니다.

 

 

목록 아래 페이지 번호 

페이지를 보여주는 작업은 다음 과정을 통해 진행합니다.

 

- 브라우저 주소창에서 페이지 번호를 전달해서 결과를 확인하는 단계

- JSP에서 페이지 번호를 출력하는 단계

- 각 페이지 번호에 클릭 이벤트 처리

- 전체 데이터 개수를 반영해서 페이지 번호 조절

 

페이지 처리는 단순히 링크의 연결이기 때문에 어렵지 않지만, 목록 페이지에서 조회 페이지, 수정 삭제 페이지까지 페이지 번호가 계속해서 유지되어야만 하기 때문에 끝까지 신경 써야 하는 부분들이 많은 편입니다.

 

페이징 처리할 때 필요한 정보들

1. 현재 페이지 번호(page)

2. 이전과 다음으로 이동 가능한 링크의 표시 여부(prev, next)

3. 화면에서 보이는 페이지의 시작 번호와 끝 번호(startPage, endPage)

 

끝 페이지 번호와 시작 페이지 번호

페이징 처리를 위해 필요한 정보는 현재 사용자가 보고 있는 페이지(page)의 정보입니다. 

 

얘를 들어, 페이지가 10페이지씩 화면에 나타난다고 했을 때

목록 아래 페이지 번호 

5페이지를 본다면 1~10 페이지를 보아야 하고, 19페이지를 본다면 11~20페이지를 보아야 합니다. 그렇기에 페이지 정보가 필요합니다. 페이지를 계산할 때 시작 번호를 먼저 구하려고 하지만, 오히려 끝 번호를 먼저 계산해 두는 것이 수월합니다.

 

페이징의 끝 번호(endPage) 계산

this.endPage = (int)(Math.ceil(페이지번호 / 10.0)) * 10;

Math.ceil( )은  소수점 올림으로 처리하기 때문에 다음과 같은 상황이 가능합니다.

 

* 1페이지의 경우 Math.ceil(0.1) * 10 = 10

* 10페이지의 경우 Math.ceil(1) * 10 = 10

* 11페이지의 경우 Math.ceil(1.1) * 10 = 20

 

끝 번호(endPage)는 아직 개선해야 될 부분이 있습니다. 전체 데이터 수가 적다면 10페이지로 끝나면 안 되는 상황이 생길 수도 있습니다. 그럼에도 끝 번호(endPage)를 먼저 계산하는 이유는 시작 번호(startPage)를 계산하기 수월하기 때문입니다.

 

만일 화면에 10개씩 보여준다면 시작 번호(startPage)는 끝 번호(endPage)에서 9라는 값을 뺀 값이 됩니다.

 

페이징의 시작 번호(startPage) 계산

this.startPage = this.endPage - 9;

 

끝 번호(endPage)는 전체 데이터 수(total)에 영향을 받습니다. 예로 10개씩 보여주는 경우 전체 데이터 수(total)가 80개이면 끝 번호(endPage)는 10이 아닌 8이 되어야만 합니다.

 

total을 통한 endPage의 재계산

readEnd = (int) (Math.ceil( total * 1.0 ) / amount) );

if (realEnd < this.endPage) {
	this.endPage = realEnd;
}

먼저 전체 데이터 수(total)를 이용해서 진짜 끝 페이지(realEnd)가 몇 번까지 되는지를 계산합니다. 만일 진짜 끝 페이지(realEnd)가 구해둔 끝 번호(endPage)보다 작다면 끝 번호는 작은 값인 진짜 끝 페이지(realEnd)가 되어야만 합니다.

 

이전(prev)과 다음(next)

페이지 목록에 '이전'과 '다음'이 있습니다.

이전(prev)의 경우는 시작 번호(startPage)가 1보다 큰 경우라면 존재

이전(prev) 계산

this.prev = this.startPage > 1;

다음(next)의 경우 realEnd가 끝 번호(endPage)보다 큰 경우라면 존재

다음(next) 계산

this.next = this.endPage < realEnd;

 

 


내용이 길어져 다음 글에 작성하겠습니다!^^

728x90
반응형