요청 매핑 헨들러 어뎁터 구조(Request Mapping Handler Adapter)
HTTP 메시지 컨버터는 스프링 MVC 어디쯤에서 사용되는 것일까?
SpirngMVC 구조
모든 비밀은 애노테이션 기반의 컨트롤러, @RequestMapping 을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter (요청 매핑 헨들러 어뎁터)에 있다.
RequestMappingHandlerAdapter 동작방식
ArgumentResolver
Spring MVC에서 ArgumentResolver는 컨트롤러 메서드에서 사용하는 매개변수들을 런타임 시점에 처리하는 기능이다.
ArgumentResolver는 컨트롤러 메서드의 매개변수를 분석하고, 그 매개변수에 값을 바인딩할 수 있는 객체를 제공한다.
HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute 같은 애노테이션 그리고 @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지 매우 큰 유연함을 보여주었다. 이렇게 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다.
애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter는 바로 이 ArgumentResolver 를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다. 그리고 이렇게 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.
스프링은 30개가 넘는 ArgumentResolver 를 기본으로 제공한다.
참고 💡
가능한 파라미터 목록은 다음 공식 메뉴얼에서 확인할 수 있다.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments
Web on Servlet Stack
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC," comes from the name of its source module (spring-webmvc), but it is more commonl
docs.spring.io
동작 방식
ArgumentResolver 의 supportsParameter() 를 호출해서 해당 파라미터를 지원하는지 체크하고, 지원하면 resolveArgument() 를 호출해서 실제 객체를 생성한다. 그리고 이렇게 생성된 객체가 컨트롤러 호출시 넘어가는 것이다.
ReturnValueHandle
ArgumentResolver 와 비슷한데, 이것은 응답 값을 변환하고 처리한다.
컨트롤러에서 String으로 뷰 이름을 반환해도, 동작하는 이유가 바로 ReturnValueHandler 덕분이다.
스프링은 10여개가 넘는 ReturnValueHandler 를 지원한다. 예) ModelAndView , @ResponseBody , HttpEntity , String
참고 💡
가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types
Web on Servlet Stack
Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC," comes from the name of its source module (spring-webmvc), but it is more commonl
docs.spring.io
HTTP 메시지 컨버터 위치
HTTP 메시지 컨버터는 어디쯤 있을까?
HTTP 메시지 컨버터를 사용하는 @RequestBody 도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다. @ResponseBody 의 경우도 컨트롤러의 반환 값을 이용한다.
요청의 경우
@RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는 ArgumentResolver 가 있다. 이 ArgumentResolver 들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하는 것이다.
응답의 경우
@ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다, 그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
스프링 MVC는
@RequestBody @ResponseBody 가 있으면
➜ RequestResponseBodyMethodProcessor (ArgumentResolver)
HttpEntity 가 있으면
➜ HttpEntityMethodProcessor (ArgumentResolver)를 사용한다.
정리 - ArgumentResolver와 MassageConverter 관계
ArgumentResolver와 MessageConverter는 모두 Spring MVC의 요청 처리 과정에서 사용되는 기능으로
ArgumentResolver는 컨트롤러 메서드에서 사용하는 매개변수들을 처리하는 기능이고, MessageConverter는 HTTP 요청 본문의 데이터를 컨트롤러 메서드에서 사용하는 객체로 변환하는 기능이다.
Spring MVC는 클라이언트의 HTTP 요청을 처리할 때, 클라이언트가 요청한 데이터의 형식에 따라 적절한 MessageConverter를 선택하고 이를 사용하여 HTTP 요청 본문을 객체로 변환한다.이렇게 변환된 객체는 컨트롤러 메서드의 매개변수로 전달되어, ArgumentResolver는 매개변수로 전달된 객체를 분석하고, 매개변수에 바인딩할 값을 결정한다.
따라서, MessageConverter와 ArgumentResolver는 서로 다른 역할을 수행하지만, Spring MVC에서 요청 처리 과정에서 밀접하게 관련되어 있다. MessageConverter가 HTTP 요청 본문을 객체로 변환한 후, 이를 ArgumentResolver가 처리하여 컨트롤러 메서드에 전달되는 것이다.
출처 : 인프런 - 스프링 MVC 1편 by 우아한형제 김영한이사님
'Spring > Spirng MVC - 기본기능' 카테고리의 다른 글
스프링 - HTTP API, 메시지 바디에 직접 입력 (0) | 2023.03.29 |
---|---|
스프링 - HTTP 응답 - 정적 리소스, 뷰 템플릿 (0) | 2023.03.29 |
스프링 - HTTP 요청 메시지 - JSON형식 조회 (0) | 2023.03.28 |
스프링 - HTTP 요청 메시지 - 단순 텍스트 (0) | 2023.03.28 |
스프링 - HTTP 요청 파라미터 - @ModelAttribute (0) | 2023.03.28 |