Java/Spring Framework

[Spring/MyBatis] 페이징 처리, Pagination 구현하기

mingmongs 2025. 3. 20. 12:43

title

API를 개발할 때, 페이징처리는 서버의 부하를 위해 꼭 필요한 기능이다.
Spring에서 제공하는 Pageable을 활용하여 페이징 처리(페이지네이션)를 하는 방법에 대해 알아보자.

 

1) Pagination(페이지네이션)

: 데이터를 정렬기준, 페이지 크기, 몇 번째 페이지인지를
  토대로 정보를 전달해주는 것

1-1) Pageable Interface

: Spring에서 페이징 처리를 하기 위해서 사용하는 인터페이스이다.

img1

객체를 생성할 때는 구현체인 PageRequest 를 사용하는데,
PageRequest 생성자를 보면 page, size, sort 가 있다.

[ PageRequset.class ]

img2

API를 호출할 때, 몇 번째 페이지인지에 대한 정보(page)
한 페이지당 보여줄 데이터의 개수(size)를 함께 담아서 호출하면 된다.

 

2) Controller

: 가장 먼저 API를 호출할 때, 페이징 관련 파라미터를 인자로 받아야한다.
Pageable은 Spring에서 제공하는 Pagination을 위한 인터페이스이다.

아래 @PageableDefault와 @SortDefault는 Spring Data Web에서 지원하는 어노테이션으로, 스프링 MVC에서 페이지네이션을 쉽게 구현할 수 있도록 한다.

  • @PageableDefault
    : 페이지 관련 설정과 정렬 기준을 설정할 수 있음. 정렬 필드는 한 개만 가능
    1. size : 한 페이지에 표시할 아이템 수
    2. page : 현재 페이지 번호(0부터 시작)
    3. sort : 정렬 기준이 될 필드와 방향(ASC 또는 DESC)
    4. direction : 기본 정렬 방향

[ ProdController.java ]

img3

@PageableDefault(size = 10, sort = "A.SHOP_CD", direction = Sort.Direction.ASC)
@Parameter(hidden = true) Pageable pageable
  • @SortDefault
    : 정렬하고 싶은 필드가 다중인 경우 사용.

img4

@PageableDefault(size = 10) @SortDefault.SortDefaults({
	@SortDefault(sort = "A.SHOP_CD", direction = Sort.Direction.ASC),
    @SortDefault(sort = "A.PROD_CD", direction = Direction.DESC)
}) @Parameter(hidden = true) Pageable pageable

 

3) Service

: API 요청을 컨트롤러에서 전달받고 그 이후에
실제 이 요청을 처리하기 위한 서비스를 호출한다.
Spring MVC 구조에서는 서비스에서 비즈니스 로직을 수행하며,
Pageable에 대한 정보도 함께 전달받아 처리한다.

3-1) 요청 데이터 가져오기

[ ProdServiceImpl.java ]

img5

먼저 필요한 정보를 쿼리문을 수행하여 DB에서 가져와야하는데,
위 코드의 searchProd 함수를 통해 쿼리문을 호출할 수 있다.
이 때, 파라미터에 pageable 객체도 함께 전달한다.

[ prodMapper.xml ]

img6

위의 xml 코드에서 searchProd 쿼리문을 수행하여 원하는 데이터를 추출한다.
이 때, 서비스에서 전달했던 Pageable 객체에 대해 처리를 한다.

  1. pageable.sort
    : Pageable 객체의 정렬 기준에 의해 ORDER BY 문을 수행할 수 있도록 함
         - property : 컬럼명
         - direction : 나열방식

3-2) 데이터 COUNT

[ ProdServiceImpl.java ]

img7

[ prodMapper.xml ]

 

4) API 호출

: 위처럼 페이지네이션 관련 로직을 다 구현하였다면,
실제 API를 호출할 때는 페이징 관련 파라미터를 함께 넘겨줘야한다.

  • page: 현재 페이지
  • size: 가져올 데이터 개수

img9

위의 실제 응답값을 살펴보면,
pageable 객체 안에 페이징과 관련된 값을 함께 확인해볼 수 있다.

  • last: 마지막 페이지인지 여부
  • totalElements: 데이터 총 개수
  • size: 한 페이지 당 데이터 개수
  • number: 현재 페이지 번호
  • sort: 정렬정보
  • first: 첫 번째 페이지인지 여부

 

 

[reference]
https://velog.io/@im_agination/Pageable-myBatis
https://precious-value.tistory.com/45
https://gksdudrb922.tistory.com/270