게시판 목록 페이징
LIMIT offset, row_count
ㆍoffset → 몇 번째 row(행)부터 읽어올지 시작 위치 지정
ㆍrow_count → 읽어 올 row 수
예를 들어, 다음 표와 같이 현재 페이지가 1페이지에 게시글이 10개씩 나타나는 목록을 만들고 싶다.
page | offset |
1 | 0 |
2 | 10 |
3 | 20 |
offset에 대한 규칙을 먼저 파악해본다. 일의 자리를 제외 한다면 다음 표와 같이 나타낼 수 있다.
page | offset |
1 | 0 |
2 | 1 |
3 | 2 |
(page - 1) 이라는 규칙을 얻어냈다. 이후 0, 10, 20에 해당하는 값을 얻어내려면 10을 곱하면 될 것이다.
따라서 최종적으로 offset은 (page - 1) * 10 이라는 결론이 나온다.
전체 페이지 갯수, 시작 및 마지막 페이지, 네비게이션 바
ㆍ전체 페이지 갯수
전체 페이지의 갯수는 (총 게시물 갯수 / 한 페이지의 크기) 로 나타낼 수 있다. 여기서 한 페이지의 크기라는 의미는 한 페이지 내 들어갈 게시물 수를 의미한다. 따라서 현재 게시물이 총 150개이고, 한 페이지당 10개의 게시물들이 들어간다고 가정하면 (150 / 10) 를 통해 총 페이지는 15개가 나옴을 알 수 있다.
이때, 한 가지 주의할 점은 아래 예와 같이 Math.ceil() 과 double형으로 나누어 주어야 정확한 값을 얻을 수 있다.
totalPage = (int)Math.ceil(totalCnt / (double)sc.getPageSize());
ㆍ시작 페이지
네비게이션 바를 기준으로 1페이지부터 10페이지에서 머물 때에는 시작 즉 첫 페이지는 1페이지가 되고 ,11페이지부터 20페이지에서 머물 때에는 시작 페이지는 11페이지가 된다. 이때 규칙을 나열해보면 아래와 같다.
page | beginPage |
5 | 1 |
15 | 11 |
20 | 11 |
25 | 21 |
35 | 31 |
먼저 현재 페이지에서 일의 자리를 버려본다. (page / navisize) 네비게이션에는 10페이지씩 보여주게 되므로 navisize는 10이 된다. 따라서 (5 / 10) 을 하면 0이 되고, (12 / 10) 을 하면 1이 된다. 하지만 0페이지부터 시작하지는 않으므로 +1을 해주어야 함을 알 수 있다.
다음으로 다시 navisize만큼 곱해주어 각 시작 페이지의 자릿수를 맞춰준다. 5페이지일 경우 시작페이지는 1이 될 것이고, 12페이지일 경우 시작페이지는 11이 될 것이다. 따라서, 현재까지 공식은 (page / navisize * navisize + 1) 이 나오게 된다.
하지만 중요한 것은 10, 20과 같은 마지막 페이지일 때인데, 그 이유는 현재 20페이지라고 가정하여 현재 공식으로 계산해보면 (20 / 10 * 10 + 1) 이므로 시작 페이지가 21이 나와버리기 때문이다. 네비게이션 바에서는 11페이지부터 20페이지까지 보여주므로 현재 20페이지라면 11페이지부터 20페이지까지 보여줘야 하는데, 시작페이지가 21이 되어버려 21페이지부터 30페이지가 나오게 된다.
따라서, (page - 1) / navisize * navisize + 1 와 같이 현재 페이지에서 -1을 해주어야 최종적으로 완성된다. 이에 의해 계산해보면 현재 20페이지일 때에 시작 페이지가 11이 나옴을 알 수 있다.
ㆍ마지막 페이지
마지막 페이지의 경우 간단하게 10페이지, 20페이지와 같이 정해져 있으므로 비교적 쉽게 규칙을 알 수 있다.
(beginPage + navisize) - 1 이라는 공식이 나오게 된다.
하지만 중요한 것은 전체 페이지의 갯수가 10페이지 미만인 상황일 수가 있으므로 아래 예제와 같이 Math.min()을 통해 더 작은 값을 마지막 페이지로 지정해주어야 하는 것에 주의한다.
endPage = Math.min(beginPage + naviSize - 1, totalPage);
ㆍ네비게이션 바 처리
이전 페이지 이동(<) 버튼과 다음 페이지 이동(>) 버튼을 보여주기 유무에 대한 처리를 해주어야 한다. 이전 페이지 이동 버튼의 경우에는 beginPage가 1이 아닐 경우에 보여주면 될 것이고, 다음 페이지 이동 버튼의 경우에는 endPage(마지막 페이지)가 totalPage(전체 페이지 갯수)가 아닐 경우에 보여주면 될 것이다. endPage가 totalPage라는 것은 곧 마지막 페이지 목록이기 때문이다.
showPrev = beginPage != 1;
showNext = endPage != totalPage;
'[패스트캠퍼스] 스프링의정석 정리 > 게시판 구현 핵심 개념' 카테고리의 다른 글
5. 댓글 및 대댓글(답글) 기능 (0) | 2023.05.11 |
---|---|
4. REST API와 Ajax (0) | 2023.05.10 |
3. 게시판 검색 기능 (0) | 2023.05.10 |
2. 게시판 CRUD (0) | 2023.05.10 |