JPA에서는 JpaRepository가 PagingAndSortingRepository를 상속하고 있어서 쉽게 페이징을 처리할 수 있었지만 Mybatis의 경우 다른 방법이 필요했다.
수동으로 구현하기에는 품이 들어서 라이브러리를 쓰기로 함.
공식 깃헙
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/en/HowToUse.md
GitHub - pagehelper/Mybatis-PageHelper: Mybatis通用分页插件
Mybatis通用分页插件. Contribute to pagehelper/Mybatis-PageHelper development by creating an account on GitHub.
github.com
pom.xml
<!-- Page Helper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
https://javadoc.io/doc/com.github.pagehelper/pagehelper/latest/index.html
pagehelper 5.3.0 javadoc (com.github.pagehelper)
Latest version of com.github.pagehelper:pagehelper https://javadoc.io/doc/com.github.pagehelper/pagehelper Current version 5.3.0 https://javadoc.io/doc/com.github.pagehelper/pagehelper/5.3.0 package-list path (used for javadoc generation -link option) http
javadoc.io
깃허브 들어가보니까 최신 버전은 5.3.0인 것 같은데 그냥 구글링해서 다른 분들 쓰시는 1.3.0버전 잡아줬다...
문서도 봤는데 구글번역기가 중국어 간체랑 번체 다 못 잡길래 그냥 해석 포기했다. 나중에 버전관리 따로 하면 될 것 같음.
application.properties
#MyBatis PageHelper
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.helper-dialect=mysql로 DB타입을 잡아준다.
기본값이 auto지만 모르는 곳에서 뭔가 벌어지게 내버려두느니 정확히 잡아두는 편이 나은 것 같다.
pagehelper.reasonable=true로 잡으면 0 <= pageNum <= pages 로 실행된다고 한다. 기본값은 false
https://oingdaddy.tistory.com/329
Springboot + MyBatis 초간단 Paging 처리하기 (with. PageHelper)
spring에서 사용할 수 있는 paging 방식은 여러개가 있다. JPA를 사용한다면 Pageable를 사용하여 간단하게 paging을 할 수도 있지만 JPA는 필자는 많이 사용하고 있지 않고 대부분이 MyBatis를 사용하므로
oingdaddy.tistory.com
나는 두 개만 잡아줬는데 진짜 엄청 잘 정리해주셔서 많이 참고했다.
MemberMapper.java
import org.apache.ibatis.annotations.Mapper;
import com.github.pagehelper.Page;
@Repository
@Mapper
public interface MemberMapper {
@Select("select * from member")
Page<Member> getPagingList();
}
마이바티스 Mapper 클래스에 select 작성해주고, return을 pagehelper.Page로 잡아준다. Page는 List<T>를 구현하고 있다.
MemberMapperTest.java
@Transactional
@Test
public void selectAllPaging() {
/*
for(int i = 1; i <= 40; i++) {
String e = "email"+ i;
Member member = Member.builder()
.user_name("test")
.user_pass("test")
.user_email(e)
.user_addr("test")
.user_tel("test")
.build();
memberRepository.save(member);
}
*/
int perPage = 5; //페이지당 글 갯수
PageHelper.startPage(1, perPage);
Page<Member> page = memberMapper.getPagingList();
Long total = page.getTotal(); //전체 row count 구하기
assertEquals(total/perPage, page.getPages()); //getPages()로 페이지수 구하기
}
어차피 @Transactional로 롤백될 테스트 데이터 40개를 JPA로 생성해서 preData로 사용했다.
진행하는 프로젝트에 무조건 마이바티스를 써야 하는 것 같은데 JPA가 편하다보니까 이런 구조가 나옴...
생성한 Page객체에서 받아 온 전체 페이지 갯수가 예상한 페이지 갯수와 같은지 테스트하는 코드다.
쿼리는 이렇게 날아간다.
1페이지만 잘 받아오는 걸 수도 있으니까 쿼리를 연속으로 날려봤다.
int perPage = 5; //페이지당 글 갯수
PageHelper.startPage(1, perPage);
Page<Member> page = memberMapper.getPagingList(); //1페이지 받아오기
PageHelper.startPage(2, perPage);
page = memberMapper.getPagingList(); //2페이지 받아오기
PageHelper.startPage(3, perPage);
page = memberMapper.getPagingList(); //3페이지 받아오기
Long total = page.getTotal(); //전체 row count 구하기
assertEquals(total/perPage, page.getPages()); //getPages()로 페이지수 구하기
당연하게 잘 나옴.
와!
'Web > Spring' 카테고리의 다른 글
[Maven] QueryDSL 사용하기 (0) | 2022.01.02 |
---|---|
[Mapper] MapStruct로 Dto/Entity 매핑하기(vs ModelMapper) (0) | 2021.11.07 |
[Maven/Eclipse] 빌드 시 target/generated-sources 인식 못 하는 문제 (0) | 2021.11.07 |
[Maven] 최초 build시 잡아야 하는 configuration (0) | 2021.11.07 |
[Test] 실제 DB로 @DataJpaTest 돌리면 뜨는 "Failed to replace DataSource with an embedded database for tests" 에러 (0) | 2021.11.06 |
댓글