mybatis

mybatis로 페이징처리를 위한 공식

Dodledd 2024. 4. 13. 22:16

저번에는 mybatis로 사용법을 다뤘다.

그럼 또 다른 유용한 기능 중 하나인 페이징 처리하는 법을 알아보자

 

그 전에 페이징처리하는 공식을 알아가면 좋다.

 

먼저 우리가 알 수 있거나 정할 수 있는건

  1. 현재 총 게시글 수
  2. 사용자가 요청한 현재 페이지
  3. 페이지 하단에 보여질 페이징 바의 개수
  4. 한 페이지 내에 보여질 게시글의 최대 개수

이것을 이용해서 우리가 구해야할 3가지

  1. 가장 마지막 페이지(총 페이지의 수)
  2. 페이징바의 시작 수
  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;

이렇게 좀 더 완성도 높은 코드가 나온다.

 

 

 

여기까지 페이징바 처리를 위해 간단하게 공식을 세워서 정리해보았다.

이것을 적용하는 건 다음 포스팅에서 해보자 !!