본문 바로가기
Spring

Spring Data JPA - Pageable을 이용한 Pagenation 처리 방법

by devLog by Ronnie's 2022. 7. 17.

들어가며


API를 만들다보면 모든 정보를 한번에 전달하는 것이 아닌 일부분만 전달해줘야하는 경우가 있다. 예를 들어 게시판과 같은 여러 글이 있는 게시글들의 정보를 전달할때이다.  Spring-Data-JPA에서는 Pageable이라는 객체를 제공하여 해당 기능을 편리하게 사용할 수 있도록 도와준다. 개념과 사용 방식에 대해서 정리한다.

 

 

Pagenation ?


게시판의 글을 보여줄 때 모든 글을 한번에 보여주는 것이 아닌 페이지별로 글을 나눠서 쪽수별로 보여준다. 정렬 방식 또한 설정 가능하다. 이처럼 요청한 페이지의 숫자와 총 몇페이지 또는 정렬 방식 등등 요청에 따라 정보를 전달해주는 것이 Pagenation이다.

 

Pageable이란?


이러한 기능을 개발자가 직접 개발을 해서 이용할 수도 있지만 JPA에서는 이를 편하게 사용할 수 있도록 Pageable이라는 객체를 제공한다. 예를 들어 요청을 할때 쿼리스트링을 통해 ‘page=3&size=10&sort=id,ASC’ 형식으로 보내게 되면 원하는 형식의 데이터들을 얻을 수 있다.

 

Pageable 사용방법


컨트롤러에서 Pageable 객체를 파라미터로 설정한 후 위에서 예시를 들었던 쿼리스트링 형식으로 요청이 들어오게 되면 Pageable 객체를 자동으로 만들어준다. 물론 page관련 dto객체를 하나 만들어서 재정의해서 사용을 하여도 된다.

 

이렇게 만들어진 Pageable 객체를 Repository로 넘기게 되고 요청한 페이지 넘버나 정렬 등의 맞는 정보를 찾아 제공해주게 된다.

 

그러면 여기서 궁금점이 생긴다. 과연 무슨 원리로 쿼리스트링으로 날아온 page와 size 등을 인식하여 Pageable 객체를 생성해주는 걸까?

 

Pageable 객체 자동 생성 원리


org.springframework.data.web 패키지의 정의된 PageableHandlerMethodArgumentResolver 클래스를 통해서 생성이 되는 것이다. 해당 클래스의 resolveArgument 메서드를 확인해보면 파라미터에서 페이지와 sort를 가져와 세팅하여 Pageable을 반환하는 것을 확인할 수 있다.

 

그리고 해당 메서드 안에 메서드들을 타고 타고 들어가보면 다음과 같이 page, size등이 정의되어 있는 것을 확인할 수 있다. 한번 PageableHandlerMethodArgumentResolver 클래스를 찾아서 이것 저것 확인해보면 다른 여러가지들도 확인할 수 있다.

 

 

근데 여기서 또 하나 궁금점이 생긴다. 다음과 같이 자동으로 생성해주는 Pageable 객체를 사용한다면 다음과 같이 기본값으로 정해져 있는 값들을 응답 받을 것이다.

그러면 이러한 기본값을 바꾸고 싶을때는 어떻게 할까?

 

@PageDefault 어노테이션


해당 어노테이션을 통해 size 및 정렬 방식 등을 설정을 해줄 수 있다. 다음과 같이 설정을 해주어 사용이 가능하다.

@PageDefault(size=100, sort="id", direction = Sort.Direction.DESC) Pageable pageable

 

개인 프로젝트를 하거나 토이 프로젝트 등에서는 어느 방식을 이용해도 상관없지만 협업을 할때 또는 프론트엔드와 백엔드 파트가 분리되어 있을때는 page관련 공통 DTO 객체를 하나 만들어서 사용하여 프로젝트 기준에 맞춰 커스텀하게 정의하고 사용하는 것도 추천한다.

댓글