[Spring Boot] Pageable 커스터마이징하기

안녕하세요. 남산돈가스입니다.

지난 포스팅 [Spring Boot] JPA + Pageable 을 이용한 페이징 처리 에서 마지막 Pageable 커스터마이징에 대한 언급을 했었는데,

이번 포스팅에서 그 내용을 다루어 보려고 합니다.

일반적으로, Pageable을 파라미터로 Controller를 구현하면 Request Parameter 를 통하여 Handling 할 수 있는 파라미터는 기본적으로 page, size, sort 이렇게 세 가지 입니다.

  • page : 조회할 페이지 번호 (default : 0)
  • size : 한 페이지 당 조회 갯 수 (default : 20)
  • sort : 정렬 기준 (정렬할 기준컬럼,ASC|DESC)
위와 같은 기본 설정을 가지고 Pageable 객체를 Handling 할 수 있습니다.

하지만 만약 기존 레거시 코드에서 Pageable을 사용하는 페이징처리로 이관하는 작업을 한다고 가정하면,

웹 화면에서 요청하던 기존 레거시 페이지 요청 파라미터를 전부 수정해줘야하는 번거로움이 생기게 됩니다. 저 또한 이와 같은 상황에서 Pageable 요청 파라미터를 커스터마이징하는 방식을 먼저 생각하게 되었습니다.

예제를 보겠습니다.


@Configuration
public class WebConfig implements WebMvcConfigurer {


    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        SortHandlerMethodArgumentResolver sortArgumentResolver = new SortHandlerMethodArgumentResolver();
        sortArgumentResolver.setSortParameter("sortBy");
        sortArgumentResolver.setPropertyDelimiter("-");

        PageableHandlerMethodArgumentResolver pageableArgumentResolver = new PageableHandlerMethodArgumentResolver(sortArgumentResolver);
        pageableArgumentResolver.setOneIndexedParameters(true);
        pageableArgumentResolver.setMaxPageSize(500);
        pageableArgumentResolver.setFallbackPageable(PageRequest.of(0,10));
        argumentResolvers.add(pageableArgumentResolver);

    }

}

@Configuration 을 이용하여 해당 설정들을 셋팅할 것이며, WebMvcConfigurer 를 참조하는 Config Class를 하나 생성합니다.

addArgumentResolvers를 Override 한 뒤 , 두개의 Resolver를 생성합니다.

1. SortHandlerMethodArgumentResolver : Sorting에 대한 설정을 수정하는 Resolver

  • setSortParameter : sort 요청 시 요청 파라미터를 수정할 수 있습니다. Default는 sort이며 예제에서는 sortBy로 수정하였습니다.
  • setPropertyDelimiter : 정렬조건 값을 전달할 때 정렬조건필드 property와 정렬기준 property를 구분하는 구분자를 설정할 수 있습니다. Default는 ",' 로 구분하며, 예제에서는 "-"로 수정하였습니다. 
  • setSortFallback : 기본 정렬 조건을 설정하는 부분입니다. 예제에는 없지만, sort 요청이 없는 경우 여기서 설정한 Sort 정보로 정렬을 하게됩니다.

2. PageableHandlerMethodArgumentResolver : Paging에 대한 설정을 수정하는 Resolver

  • setOneIndexParameters : page 기본값을 1로 설정하게 합니다. Pageable 파라미터 중 page는 페이지 번호를 뜻하는데, 1페이지가 0으로 인식됩니다. 그래서 화면에서 쓰이는 페이지 번호랑 상이한 케이스가 있어 이 값을 true로 설정하면 화면에서 쓰이는 페이지 번호와 동일하게 1페이지부터 시작할 수 있도록 합니다.
  • setMaxPageSize : Paging 요청에 대해 한 번에 많은 갯수를 요청하는 경우를 대비하여, 최대 요청 가능한 size를 설정할 수 있습니다.
  • setFallbackPageable : 페이지 요청이 없는 경우 기본적으로 요청되는 페이징 정보를 설정할 수 있습니다. Default는 page 0, size 20 입니다.
  • setPageParameterName : page 파라미터명을 수정할 수 있습니다.
  • setSizeParameterName : size 파라미터명을 수정할 수 있습니다.

위 두개의 Resolver를 이용하여, 원하시는 Pagination, Sorting을 구현할 수 있습니다.


{
    "content": [
        {
            "createdDate": "2020-03-13T07:05:46",
            "updatedDate": "2020-03-13T07:05:46",
            "id": 1,
            "title": "1번 게시글",
            "content": "안녕하세요",
            "writer": "남산돈가스"
        },
        {
            "createdDate": "2020-03-13T08:05:46",
            "updatedDate": "2020-03-13T07:05:46",
            "id": 2,
            "title": "2번 게시글",
            "content": "안녕하세요",
            "writer": "남산돈가스"
        },
        {
            "createdDate": "2020-03-13T10:05:46",
            "updatedDate": "2020-03-13T07:05:46",
            "id": 4,
            "title": "4번 게시글",
            "content": "안녕하세요",
            "writer": "남산돈가스"
        },
        {
            "createdDate": "2020-03-13T12:05:46",
            "updatedDate": "2020-03-13T07:05:46",
            "id": 6,
            "title": "6번 게시글",
            "content": "안녕하세요",
            "writer": "남산돈가스"
        },
        {
            "createdDate": "2020-03-13T13:05:46",
            "updatedDate": "2020-03-13T07:05:46",
            "id": 7,
            "title": "7번 게시글",
            "content": "안녕하세요",
            "writer": "남산돈가스"
        }
    ],
    "pageable": {
        "sort": {
            "unsorted": false,
            "sorted": true,
            "empty": false
        },
        "offset": 0,
        "pageSize": 5,
        "pageNumber": 0,
        "paged": true,
        "unpaged": false
    },
    "totalElements": 18,
    "totalPages": 4,
    "last": false,
    "size": 5,
    "number": 0,
    "sort": {
        "unsorted": false,
        "sorted": true,
        "empty": false
    },
    "first": true,
    "numberOfElements": 5,
    "empty": false
}

감사합니다.

댓글

주간 인기글

[정보] 인스타그램은 당신의 소리를 '듣고' 있을 수도 있습니다

[AWS] WinSCP 를 이용해 Linux 인스턴스로 파일 전송하기

안드로이드에서 당겨서 새로고침(SwipeRefreshLayout) 쉽게 구현하기

[AWS] Amazon 통합결제와 대량구매할인 서비스

[앱 디자인] 벤치마킹에 유용한 사이트