본문 바로가기

Programming/Spring Boot

[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
}

감사합니다.