[Spring] HandlerMethodArgumentResolver?

HandlerMethodArgumentResolver

김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 이미지 참조 : 김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

ArgumentResolver

HttpServletRequest, Mode, @RequestParam, @ModelAttribute, @RequestBody, HttpEntity 모두 처리 가능하도록 ArgumentResolver 인터페이스를 구현한 구체 클래스들이 존재.

동작방식

ArgumentResolver의 supportsParameter()를 호출해서 해당 파라미터를 지원하는지 체크, 지원한다면 resolveArgument()를 호출해서 실제 객체를 생성한다. 그리고 이렇게 생성된 객체가 컨트롤러 호출 시 넘어가는 것.
→ 직접 인터페이스를 확장해 커스터마이징한 ArgumentResolver를 만들 수 있음.

ArgumentResolver가 HttpMessageConverter를 사용해 요청과 응답시 필요한 객체 혹은 데이터 변환을 처리함.

Customize HandlerMethodArgumentResolver

1. WebMvcConfigurer의 addArgumentResolvers 오버라이드

@Configuration
public class WebMvcConfigure implements WebMvcConfigurer {

	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
		argumentResolvers.add(Search());
	}

	public HandlerMethodArgumentResolver Search() {
		return new SearchArgumentResolver();
	}
}

2. HandlerMethodArgumentResolver 구현

public class SearchArgumentResolver implements HandlerMethodArgumentResolver {

   /* 지원 여부 */
   @Override
   public boolean supportsParameter(MethodParameter methodParameter) {
      return methodParameter.getParameterType().equals(Search.class);
   }

   /* 인자 할당 */
   @Override
   public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
      NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
      return new Search(
         LocalDate.parse(nativeWebRequest.getParameter("date"), DateTimeFormatter.ISO_DATE),
         nativeWebRequest.getParameter("test1"),
         nativeWebRequest.getParameter("test2")
      );
   }
}

3. 사용

@RestController
public class TestController{
	@GetMapping("/test")
	public String retrieve(Search search) throws Exception {
		return testService.retrieve(search);
	}
}

References