본문 바로가기
Web/Spring

[Mybatis/Pagination] PageHelper로 Paging처리하기

by 정고정 2021. 11. 7.
반응형

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()로 페이지수 구하기

당연하게 잘 나옴.

와!

반응형

댓글