상세 컨텐츠

본문 제목

PageHelper를 이용한 페이징처리 (Mybatis)

Spring/JAVA

by Chan.94 2024. 8. 27. 13:05

본문

반응형

PageHelper

Paging처리를 위해 직접 구현할 수 있지만 DB마다 쿼리를 다르게 적용해야 하고 Paging처리를 위한 전체 페이지, 현재 페이지 등을 계산하는 로직까지 구현해야 한다.

 

MyBatis를 사용한다면 PageHelper를 이용하여 간편하게 Paging처리를 구현할 수 있다.

 

PageHelper는 Mybatis를 사용할 때 Paging처리를 도와주는 오픈소스이다.


pom.xml

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
</dependency>

application.yml

pagehelper:
  helper-dialect: oracle                        # DB 종류
  reasonable: true                              # true 일시 0 <= pageNum <= pages 로 실행
  support-methods-arguments: true               # true이면 mapper에서 page parameter 사용가능

spring: 
  main:
    allow-circular-references: true             # 순환 참조

 

Error creating bean with name 'com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration': Requested bean is currently in creation: Is there an unresolvable circular reference?

PageHelper를 사용하기 위해 설정하다 해당 오류를 만나게 되면 allow-circular-references 순환 참조 옵션을 true로 설정한다. Spring Boot 버전에 따라 기본값이 다르기 때문이다.

 

Spring Boot 기본값

  • Spring Boot 2.6.x 이상: 기본값이 false로 설정되어 있어 순환 참조를 허용하지 않음.
  • Spring Boot 2.5.x 이하: 기본값이 true로 설정되어 있어 순환 참조를 허용함.

 


PageHelper Example

PageInfo<User> page = PageHelper.startPage(pageNum, pageSize)
                                .doSelectPageInfo(() -> userMapper.selectUser());

log.info("TotalCount : {}, CurrentPage : {}, PageSize : {}, TotalPage : {}", page.getTotal()
                                                                           , page.getPageNum()
                                                                           , page.getPageSize()
                                                                           , page.getPages());

List<User> userList = page.getList();

 

  • startpage(pageNum, pageSize)
    pageNum : 페이지 번호
    pageSize : 페이지 Row 수

  • doSelectPageInfo(mapper)
    람다식으로 mapper연결

  • PageInfo <객체>로 반환됨.
    PageInfo에는 Paging처리에 필요한 다양한 정보가 있음.

  • pageInfo.getList로 List <객체>를 추출.

PageInfo.java

// 현재 페이지
private int pageNum :
// 페이지당 Row 수
private int pageSize ;
// 현재 페이지 수
private int size ;
// 현재 페이지의 첫 번째 요소가 데미터베미스에 있는 줄 번호
private long startRow ;
// 현재 페이지의 마지막 요소가 데미터베미스에 있는 줄 번호
private long endRow ;
// 전체 페이지 수
private int pages ;
// 이전 페이지
private int prePage ;
// 다음 페이지
private int nextPage ;
// 첫 페이지인지 며부
private boolean isFirstPage = false ;
// 마지막 페이지인지 며부
private boolean isLastPage = false ;
// 이전 페이지가 있는지 며부
private boolean hasPreviousPage = false ;
// 다음 페이지가 있는지 며부
private boolean hasNextPage = false ;
// 내비게미션 페이지 번호
private int navigatePages :
// 모든 내비게미션 페이지 번호
private int [ ] navigatepageNums ;
// 내비게미션 바의 첫 페이지
private int navigateFirstPage ;
// 내비게미션 바의 마지막 페이지
private int navigateLastPage ;

 


 

기존 SQL

SELECT
    *
FROM DEV_USER

 

PageHelper를 이용한 SQL 결과

SELECT * FROM (  SELECT TMP_PAGE.*, ROWNUM PAGEHELPER_ROW_ID FROM ( 
      SELECT
         *
      FROM DEV_USER
 ) TMP_PAGE) WHERE PAGEHELPER_ROW_ID <= 2 AND PAGEHELPER_ROW_ID > 0

 

반응형

관련글 더보기

댓글 영역

>