mybatis로 페이징처리를 위한 공식
저번에는 mybatis로 사용법을 다뤘다.
그럼 또 다른 유용한 기능 중 하나인 페이징 처리하는 법을 알아보자
그 전에 페이징처리하는 공식을 알아가면 좋다.
먼저 우리가 알 수 있거나 정할 수 있는건
- 현재 총 게시글 수
- 사용자가 요청한 현재 페이지
- 페이지 하단에 보여질 페이징 바의 개수
- 한 페이지 내에 보여질 게시글의 최대 개수
이것을 이용해서 우리가 구해야할 3가지
- 가장 마지막 페이지(총 페이지의 수)
- 페이징바의 시작 수
- 페이징바의 마지막 끝 수
이다. 코드로 보면
int listCount; //현재 총 게시글 수
int currentPage; //현재 페이지(사용자가 요청한 페이지)
int pageLimit; //페이지 하단에 보여질 페이징바의 개수
int boardLimit; // 한 페이지내에 보여질 게시글 최대갯수
//위 4개의 값을 기준으로 아래 3개의 값을 구해야함
int maxPage; // 가장 마지막페이지(총 페이지의 수)
int startPage; // 페이징바의 시작수
int endPage;//페이징바의 마지막 끝수
그럼 listCount인 총 게시글 수는 어떻게 가져오나?
- DB에 가서 직접 가져오면 된다.
listCount = new BoardService().selectListCount();
currentPage(사용자가 요청한 페이지)는 어떻게 알아오나?
- jsp, 프런트에서 값을 보내줄테니 꺼내 쓰면된다.
currentPage = Integer.parseInt(request.getParameter("cpage"));
pageLimit (페이징바의 최대 개수)는?
- 우리가 정해준다. (임의로 10)
pageLimit = 10;
boardLimit(한 페이지 내에 보여질 게시글의 최대 개수)는?
- 우리가 정해준다. (임의로 10)
boardLimit = 10;
maxPage(제일 마지막 페이지의 수)는?
총 게시글 수 (listCount)가 100개라고 치자
한 페이지에 보여질 게시글의 최대 개수는 (boardLimit) 10개로 정했다. 예를 보자
listCount boardLimit maxPage
* 100 10 => 10 10
* 101 10 => 10.1 11
* 105 10 => 10.5 11
* 115 10 => 11.5 12
감이오는가?
이것을 공식화 하면
maxPage =( listCount(총 게시글 수) / boardLimit(한 페이지의 최대 게시글 수) )를 올림처리 해주면된다.
maxPage = (int)Math.ceil((double)listCount / boardLimit);
startPage (페이징 바의 시작 수)는?
pageLimit (현재 페이지의 최대 게시글 수)와 currentPage(현재 페이지)의 영향을 받는다.
예를들어 페이징바의 목록이 10 단위라면
startPage는 1, 11, 21, 31, 41 ... 일 것이다.
이것을 공식화하면
n*currentPage + 1 일 것이다.
그럼 여기서 n을 구해야하는데
n은
1~10 => n=0
11~20 => n=1
21~30 => n=2
...
임을 알 수 있다.
그러면 조금 응용해서
currentPage - 1 / pageLimit => n
0~9 / 10 0
10~19 / 10 1
20~29 / 10 2
currentPage에서 -1해주고 그것을 pageLimit으로 나눠준다면 n이 나오는 것을 알 수 있다.
n을 구했으니 위의 식 n*currentPage +1에 대입해주면
startPage = ((currentPage - 1) / pageLimit) * pageLimit + 1;
완성이다.
endPage(페이징바의 끝 수)
pageLimit : 10이라는 가정하에
startPage: 1=> endPage : 10
startPage: 11=> endPage : 20
startPage: 21=> endPage : 30
이것도 공식화 하면
endPage = startPage + pageLimit - 1;
가 나오게 된다.
여기서 잔머리를 조금 더 굴려주면
//startPage가 11이면 endPage는 20이다(만약 maxPage가 13이라면?)
endPage = endPage > maxPage ? maxPage : endPage;
이렇게 좀 더 완성도 높은 코드가 나온다.
여기까지 페이징바 처리를 위해 간단하게 공식을 세워서 정리해보았다.
이것을 적용하는 건 다음 포스팅에서 해보자 !!