본문 바로가기

심화 캠프 정리

PageableArgumentResolver

PageableArgumentResolver란 무엇인가?

PageableArgumentResolver는 Spring MVC에서 제공하는 기능으로, 컨트롤러 메서드에서 Pageable 타입의 파라미터를 사용할 수 있게 해주는 역할을 한다.

즉 Pageable에 대한 클라이언트의 요청이 들어왔을 때 컨트롤러에 도달하기 전 관련된 요청 파라미터들을 바인딩하는 데 사용된다.

예를 들면 서비스에서는 매장 조회를 50개까지 제한하고 있지만 클라이언트가 100개를 보낸다면 

PageableArgumentResolver를 통해 조회 컨트롤러에 도달하기 전에 50개로 제한해서 컨트롤러에 전해주는 역할을 담당한다.

 

좀 더 구체적으로 들어가서 동작하는 순서를 본다면

 

클라이언트 -> DispatcherServlet -> HandlerMapping -> HandlerAdapter 
    -> PageableArgumentResolver -> 컨트롤러 실행 -> 응답

 

위와 같은 순서로 동작한다.

 

실제로 PageableArgumentResolver를 구현하기 위해서는 PageableHandlerMethodArgumentResolver를 상속받아서 

resolveArgument를 오버라이딩하여 사용해야 한다.

 

아래는 PageableHandlerMethodArgumentResolver를 상속받아 커스텀 클래스를 만들고, resolveArgument 메서드를 오버라이딩하여 기능을 변경한 예제이다.

사이즈가 5개 이하로 들어온다면 그대로 리턴하고 넘어간다면 5개로 제한하는 기능으로 간단하게 구성했다.

public class CustomPageableArgumentResolver extends PageableHandlerMethodArgumentResolver  {

    @Override
    public Pageable resolveArgument(
       MethodParameter methodParameter,
       ModelAndViewContainer mavContainer,
       NativeWebRequest webRequest,
       WebDataBinderFactory binderFactory
    ) {
       Pageable pageable = super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory);
       pageable = validatePageSize(pageable);


       return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), pageable.getSort());
    } 

    private Pageable validatePageSize(Pageable pageable) {
		int pageSize = pageable.getPageSize();
		if (pageSize <= 5) {
			return pageable;
		} else {
			return PageRequest.of(pageable.getPageNumber(), 5, pageable.getSort());
		}
	}


}

 

매장 10개를 만들어서 테스트를 진행 

 

이제 실제로 size 10개로 요청을 보냈을 때 5개로 나온다면 정상적으로 작동하는 것이다.

5개가 출력되는 것을 확인할 수 있다.

5개 이하라면?

정상적으로 작동한다.

 

PageableArgumentResolver를 사용하지 않는다면 QueryDSL을 사용하여 따로 메서드를 작성하여 제어를 해야 한다.

도메인이 하나라서 사용하는 것은 문제가 되지 않을 것이지만 도메인이 여러 개라서 같은 메서드를 계속 사용해야 된다면 중복코드가 심해질 것이다. 따라서 Pageable을 사용하여 무언가를 제어해야 하거나 조건이 필요하다면 PageableArgumentResolver을 사용하여 커스텀으로 구현하는 걸 추천한다!

 

'심화 캠프 정리' 카테고리의 다른 글

RestTemplate vs FeignClient  (1) 2024.11.20
ModelAttribute  (0) 2024.11.20
동적쿼리 BooleanExpression  (0) 2024.11.20
동적쿼리 OrderSpecifier  (0) 2024.11.20
PreAuthorize  (2) 2024.11.19