컨트롤러 메서드의 파라미터로 특정 객체를 입력하면 스프링이 자동으로 해당 객체를 처리하여 사용할 수 있도록 한다. 예를 들어 다음과 같은 코드에서
public ResponseEntity<Paging> popular(**PagingRequest pagingRequest**) {
Paging<MovieDto.Response> popular = movieService.findPopular(pagingRequest);
return ResponseEntity.ok(popular);
}
스프링은 쿼리 스트링에 담긴 값을 바탕으로 PagingRequest라는 인스턴스를 생성하고 값을 할당한다. 이 역할은 rgumentResolver라는 클래스들이 담당하는 것인데 그 과정을 자세히 알아보자.
ArgumentResolver와 관련있는 첫 진입점은 InvocableHandlerMethod 클래스이다. getMethodArgumentValues()에 디버거를 찍으면 다음과 같이 파라미터 정보를 확인할 수 있다.
// InvocableHandlerMethod 클래스
protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
MethodParameter[] parameters = this.getMethodParameters();
// 디버거
guckflix.backend.dto.paging.PagingRequest arg0
처리해야 할 파라미터 정보를 알고 있기 때문에 다음은 이를 처리하기 위한 Resolver를 찾을 수 있다.
// InvocableHandlerMethod.getMethodArgumentValues()
if (!this.resolvers.supportsParameter(parameter)) {
throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
}