본문 바로가기

개발/Framework

[Mybatis] Mybatis 페이징처리 / RowBounds 사용

 

< 페이징 처리에 필요한 변수들 >

listCount 게시글의 총 개수
pageLimit 페이지 하단에 보여질 페이징바의 최대 개수
boardLimit 한 페이지에 보여질 게시글의 최대 개수
currentPage 현재 페이지(사용자가 요청한 페이지)
maxPage 총 페이지의 개수 
startPage 페이지 하단에 보여질 페이징바의 시작 수
endPage 페이지 하단에 보여질 페이징바의 끝 수

 

* maxPage 연산

 

ex) boardLimit이 10이라고 했을 때
총 개수(listCount)     boardLimit(10개)       maxPage(마지막페이지)
- 100개               /       10개                            = 10       10번 페이지
- 102개               /       10개                            = 10.2    11번 페이지
- 107개               /       10개                            = 10.7    11번 페이지
- 110개               /        10개                           = 11.0     11번 페이지

- 111개               /         10개                          = 11.1      12번 페이지   

=> 나눗셈결과(listCount/boardLimit)를 올림처리 할 경우 maxPage가 된다.

maxPage = (int)Math.ceil((double)listCount / boardLimit);

 

* startPage 연산 : pageLimit, currentPage에 영향을 받음

 

ex) pageLimit이 10이라고 했을 때

startPage : 1, 11, 21, 31, 41 => n * 10 + 1

즉, startPage = n * pageLimit + 1

  currentPage /                                                  /  startPage

=> 1 ~ 10       /     n * 10 + 1      =>       n = 0   +   1
=> 11 ~ 20     /      n * 10 + 1      =>       n = 1   +   2
=> 21 ~  30    /       n * 10 + 1     =>       n = 2   +   3

n = (currentPage - 1) / pageLimit

startPage = (currentPage - 1) / pageLimit * pageLimit + 1;

 

* endPage 연산 : startPage, pageLimit에 영향을 받음

 

ex) pageLimit이 10이라고 했을 때

startPage :  1 => endPage : 10
startPage : 11 => endPage : 20
startPage : 21 => endPage : 30
...

endPage = startPage + pageLimit - 1;
if(endPage > maxPage) {
  endPage = maxPage;
}

 

 

* 게시판마다 계속 사용할 수 있게 메소드로 만들어서 사용

: 그때그때 달라져야 하는 변수 4개를 매개변수로 받아 PageInfo 객체를 생성해 반환하는 메소드

public static PageInfo getPageInfo(int listCount, int currentPage, int pageLimit, int boardLimit) {

    int maxPage = (int)Math.ceil(((double)listCount / boardLimit));
    int startPage = (currentPage - 1) / pageLimit * pageLimit + 1;
    int endPage = startPage + pageLimit - 1;
    if(endPage > maxPage) {
        endPage = maxPage;
    }

    PageInfo pi = new PageInfo(listCount, currentPage, pageLimit, boardLimit,
                                maxPage, startPage, endPage);

    return pi; // PageInfo 객체 반환
}

 

 

< MyBatis - RowBounds >

 

RowBounds 파라미터는 마이바티스로 하여금 특정 개수 만큼의 레코드를 건너띄게 한다. RowBounds클래스는 offset과 limit 둘다 가지는 생성자가 있다.
int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);

> offset : 몇 개의 게시글을 건너뛰고 조회할 건지에 대한 값

> limit : boardLimit (한 페이지에 보여질 게시글의 최대 개수)

 

 

* offset 연산

 

ex) boardLimit이 5일 경우
                                                offset(건너 뛸 숫자)         boardLimit(조회할 숫자)
currentPage : 1 → 1 ~ 5                       0                                    5
currentPage : 2 → 6 ~ 10                     5                                    5
currentPage : 3 → 11 ~ 14                  10                                   5

int offset = (pi.getCurrentPage() - 1) * pi.getBoardLimit();
RowBounds rowBounds = new RowBounds(offset, pi.getBoardLimit());

// RowBounds객체를 넘겨야 할 경우
// selectList메소드의 오버로딩된 형태 중 매개변수가 3개인 메소드를 사용
// 딱히 두 번째 매개변수 자리에 넘길 값이 없다면 null을 넘겨줌
<E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
                       // 매퍼파일.sql명, sql문에 넘길 값, 생성한 RowBounds