요청 매핑 핸들러 어댑터

HTTP 메시지 컨버터는 4번에서 handler를 호출하는 RequestMappingHandlerAdapter(요청 매핑 핸들러 어댑터)와 관련있다.
RequestMappingHandlerAdapter 동작 방식

ArgumentResolver
@Slf4j
@Controller
public class RequestBodyStringController {
@PostMapping
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) {
...
}
@PostMapping
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
...
}
@ResponseBody
@PostMapping
public String requestBodyStringV4(@RequestBody String messageBody) {
...
}
}
컨트롤러 메서드에는 파라미터, 애너테이션 등등 많은 정보가 있다. 이 정보를 ArgumentResolver가 처리해준다.
RequestMappingHandlerAdapter는 이 ArgumentResolver를 호출해 컨트롤러(핸들러)에게 필요한 파라미터 값을 생성한다.
파라미터 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.

ArguemntResolver는 정확히 말하면 HandlerMethodArgumentResolver라고 한다.
supportsParameter()
파라미터 정보를 보고 이 값을 지원하는지 확인한다.
resolverArgument()
지원한다면 객체를 만들어서 반환한다.
리턴 타입을 보면 Object인 것을 알 수 있다.
원한다면 이 인터페이스를 직접 확장해서 커스텀할 수 있다.
Reference
ReturnValueHandler

HandlerMethodReturnValueHandler를 줄여서 부르는 명칭
ReturnValueHandler 덕분에 컨트롤러에서 String, ModelAndView, @ResponseBody 등 다양한 값을 반환할 수 있다.
Reference
HTTP 메시지 컨버터

메시지 컨버터는 ArgumentResolver와 ReturnValueHandler에 있다.
@RequestBody, @ResponseBody
RequestResponseBodyMethodProcessor라는 ArgumentResolver가 처리한다.
HttpEntity
HttpEntityMethodProcessor라는 ArgumentResolver가 처리한다.
요청
@RequestBody, HttpEntity 등을 처리하는 ArgumentResolver가 있다.
이 ArgumentResolver가 HTTP 메시지 컨버터를 이용해 필요한 객체를 생성한다.
응답
@ResponseBody, HttpEntity 등을 처리하는 ReturnValueHandler가 있다.
이 ArgumentResolver가 HTTP 메시지 컨버터를 호출해 응답 결과를 만든다.

ArgumentResolver에서 메시지 컨버터를 호출하는 걸 볼 수 있다.
확장
HandlerMethodArgumentResolver
HandlerMethodReturnValueHandler
HttpMessageConverter
스프링은 이 세 가지를 모두 인터페이스로 제공하기 때문에 필요하면 언제든 확장할 수 있다. 스프링이 대부분을 지원하기 때문에 확장할 일은 거의 없긴 하다.
class Example {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
...
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
...
}
};
}
}
만약 필요하다면 WebMvcConfigurer를 상속받아서 스프링 빈으로 등록하면 된다.
Last updated
Was this helpful?