RequestMappingHandlerAdapter
는@RequestMapping
은 를 처리하는 핸들러 어댑터이다.
@RequestMapping
기반의 컨트롤러는 다양한 파라미터를 사용할 수 있다.
예를 들면 `HttpServletRequest
, Model
, @RequestParam
, @ModelAttribute
, @RequestBody
, HttpEntity
등이 있다.
이렇게 많은 파라미터를 처리하는 등 매우 유연한 모습을 보여줄 수 있는 이유는 ArgumentResolver
를 호출해 컨트롤러(=핸들러)가 필요한 파마미터 값(객체)를 생성하기 때문이다.
ArgumentResolver
란 정확히 HandlerMethodArgumentResolver
이고, 줄여서 ArgumentResolver
라고한다.
파라미터를 각 타입으로 변환시켜주는 리졸버이다.
스프링에는 약30개 이상의ArgumentResolver
가 존재함
RequestMapping
핸들러 어댑터가 ArgumentResolver
의 supportsParameter()
를 호출해서 컨트롤러(=핸들러)가 원하는 파라미터를 지원하는지 확인resolveArgument()
를 호출해 파라미터를 변환RequestMapping
핸들러 어댑터가 변환된 파라미터를 넘겨주며 컨트롤러(=핸들러) 호출ReturnValueHandler
란 정확히HandlerMethodReturnValueHandler
이다.
이것은 ArgumentResolver
와 비슷한데, ArgumentResolver
는 요청 값에 대한 변환을 처리했다면 ReturnValueHandler
는 응답 값에 대한 처리를 한다.
응답 값을 String
으로 리턴해도 뷰 이름으로 동작하게 해주고, @ResponseBody
가 붙어있으면 그대로 반환하게 해주는 이유이다.
이것도 ArgumentResolver
와 같이 spring에서 여러개의 ReturnValueHandler
가 존재한다.
ArgumentResolver
의 동작 방식과 비슷하다.
요청의 경우 ArgumentResolver
를, 응답의 경우 ReturnValueHandler
를 사용해서 각각의 값을 변환한다.
이렇게 변환을 할 때에 사용하는 것이 HTTP 메시지 컨버터
이기때문에 HTTP 메시지 컨버터
는 ArgumentResolver
와 ReturnValueHandler
안에서 호출되어 사용된다.