Pagination이란?

데이터베이스에 저장되어 있는 모든 정보를 조회하여 화면에 출력하면 데이터가 많을수록 로딩 속도가 느려지고 보기에도 안좋다.
이러한 불편함을 해결하기 위해 데이터중 일부만 조회하여 보여주는 방식이 페이징 처리이다.
직접 현재 페이지와 목록 개수, 정렬과 관련된 기능을 구현할 수 있지만 JPA 제공해주는 Pageable 객체를 사용하면 편리하게 구현할 수 있다. 요청 파라미터로 page, size, sort를 받아 사용한다.

  • page: 현재 페이지 (0부터 시작)
  • size: 한 목록에 보여줄 개수(기본값 20)
  • sort: 정렬 기준

Pageable

Controller와 Repository 메소드에 파라미터로 Pageable 객체를 넣어주면 설정은 끝이다.


@Controller
public class BoardController {

    @GetMapping("/board/list")
    public List<Board> boardList(Pageable pageable) {
        ...
    }
}

@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {

    Page<Board> findAll(Pageable pageable);
    Slice<Board> findAll(Pageable pageable);
    List<Board> findAll(Pageable pageable);
}

Page, Slice, List로 다양하게 제공하고 있다. Page는 전체 페이지 크기를 구해야하기 때문에 별도의 count 쿼리가 실행되고 Slice는 전체 크기를 구하지않고 이전 or 다음 Slice가 존재하는지만 확인할 수 있다. 데이터가 많으면 Slice가 유리하지만 기능에 따라서 반환 타입을 설정하면 된다.

커스터마이징

페이지 크기와 정렬 기준 등 원하는 값으로 변경하는 방법이 3가지 정도 있다.

  1. @PageableDefault
  2. application-properties
  3. PageableHandlerMethodArgumentResolverCustomizer

먼저 @PageableDefault를 살펴보자

@Controller
public class BoardController {

    @GetMapping("/board/list")
    public List<Board> boardList(
        @PageableDefault(size = 10, sort = "time", direction = Sort.Direction.DESC) Pageable pageable) {
        ...
    }
}

Pageable 앞에 @PageableDefault 어노테이션과 속성 값을 지정하면 된다. 위 코드는 한 페이지당 10개씩 보여주고 “time” 컬럼을 기준으로 내림차순 하겠다는 의미다.

두번째 방법으로 해당 값을 스프링 전체에 적용하고 싶다면 application.properties 파일에 작성하면 된다.

spring.data.web.pageable.default-page-size=10
spring.data.web.pageable.max-page-size=20
spring.data.web.sort.sort-parameter=time

마지막으로 application.properties에 작성한 내용을 PageableHandlerMethodArgumentResolverCustomizer 별도의 인터페이스를 만들고 적용하면 된다.

@Configuration
public class CustomPageableConfig {

    @Bean
    public PageableHandlerMethodArgumentResolverCustomizer customize() {
        return p -> {
            p.setMaxPageSize(10); //최대로 보여줄 사이즈
            p.setOneIndexedParameters(true); //page 1부터 시작
            p.setPageParameterName("page"); // 요청 파라미터 이름
            ...
        };
    }
}

모두 설정했다면 우선순위는 @PageableDefault -> PageableHandlerMethodArgumentResolverCustomizer -> application.properties 순으로 적용된다.

카테고리:

업데이트:


Comments