오봉이와 함께하는 개발 블로그
스프링 MVC 1 - 요청 매핑 핸들러 어탭터 구조 본문
요청 매핑 핸들러 어댑터 구조
HTTP 메시지 컨버터는 스프링 MVC 어디쯤에서 사용되는 것인가?
SpringMVC 구조
이 그림에서는 보이지 않는다.
모든 비밀은 어노테이션 기반 컨트롤러@RequestMapping
을 처리하는 핸들러 어댑터인 RequestMappingHandlerAdapter
(요청 매핑 핸들러 어댑터)에 있다.
RequestMappingHandlerAdapter 동작 방식
- RequestMapping 핸들러 어댑터로 요청
- RequestMapping 핸들러 어댑터는 ArgumentResolver에 정보를 넘김
- ArgumentResolver에 컨트롤러의 파라미터, 어노테이션 정보 기반으로 전달 데이터를 생성
- RequestMapping 핸들러 어댑터는 ArgumentResolver가 생성한 데이터를 핸들러를 호출하며 파라미터 전달
- 컨트롤러가 동작하여 반환된 값을 ReturnValueHandler가 반환 값을 변환한다.
ArgumentResolver
어노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있다.HttpServletRequest
, Model
, @RequestParam
, @ModelAttribute
,@RequestBody
, HttpEntity
이렇게 파라미터를 유연하게 처리할 수 있는 이유가 바로 ArgumentResolver
덕분이다.
어노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter
는 바로 이 ArgumentResolver
를 호출해서 컨트롤러(핸들러)가 필요로 하는 다양한 파라미터의 값(객체)을 생성한다.
그리고 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.
스프링은 30개가 넘는 ArgumentResolver
를 기본으로 제공한다.
정확히는 HandlerMethodArgumentResolver
인데 줄여서 ArgumentResolver
라고 부른다.
ArgumentResolver 동작 방식
ArgumentResolver
의supportsParameter()
를 호출해서 해당 파라미터를 지원하는지 체크- 지원하면
resolveArgument()
를 호출해서 실제 객체를 생성 - 생성된 객체가 컨트롤러 호출시 넘어간다.
원한다면 직접 이 인터페이스를 확장해서 원하는 ArgumentResolver
를 만들 수도 있다.
ReturnValueHandler
HandlerMethodReturnValueHandler
를 줄여서 ReturnValueHandler
라 부른다.ArgumentResolver
와 비슷한데 이것은 응답 값을 변환하고 처리한다.
컨트롤러에서 String으로 뷰 이름을 반환해도, 동작하는 이유가 바로 ReturnValueHandler
덕분이다.
스프링은 10여개가 넘는 ReturnValueHandler
를 지원한다.
예 : ModelAndView
, @ResponseBody
, HttpEntity
, String
HTTP 메시지 컨버터
HTTP 메시지 컨버터 위치
HTTP 메시지 컨버터는 ArgumentResolver, ReturnValueHandler가 사용한다.
HTTP 메시지 컨버터를 사용하는 @RequestBody
도 컨트롤러가 필요로 하는 파라미터(매개변수)의 값에 사용된다. -> 결국 ArgumentResolver가 해결해야 한다.
@ResponseBody
의 경우도 컨트롤러의 반환 값을 이용한다. -> ReturnValueHandler가 해결해야 한다.
요청의 경우
@RequestBody
를 처리하는 ArgumentResolver
가 있고, HttpEntity
를 처리하는 ArgumentResolver
가 있다.
이 ArgumentResolver
들이 HTTP 메시지 컨버터를 사용해서 컨트롤러가 필요한 파라미터 혹은 어노테이션에 따라 객체를 생성하는 것이다.
(canRead()를 사용한다.)
응답의 경우
@ResponseBody
와 HttpEntity
를 처리하는 ReturnValueHandler
가 있다.
그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
(canWrite()를 사용한다.)
스프링 MVC는@RequestBody
, @ResponseBody
가 있으면 RequestResponseBodyMethodProcessor(ArgumentResolver)
HttpEntity
가 있으면 HttpEntityMethodProcessor(ArgumentResolver)
를 사용한다.
확장
스프링은 다음을 모두 인터페이스로 제공하기 때문에 필요하면 언제든지 기능을 확장할 수 있다.
- HandlerMethodArgumentResolver
- HandlerMethodReturnValueHandler
- HttpMessageConverter
스프링이 필요한 대부분 기능을 제공하기 때문에 실제 기능 확장을 할 일이 많지 않다.
기능 확장은 WebMvcConfigure
를 상속 받아서 스프링 빈으로 등록하면 된다.
실제 자주 사용하진 않지만 확장이 필요할 때 해당 클래스를 검색하자.
출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
'BE > Spring' 카테고리의 다른 글
스프링 MVC 1 - PRG(Post/Redirect/Get), RedirectAttribute (0) | 2022.08.15 |
---|---|
스프링 MVC 1 - @ModelAttribute (0) | 2022.08.15 |
스프링 MVC 1 - HTTP 메시지 컨버터 (0) | 2022.08.15 |
스프링 MVC 1 - 응답(정적 리소스, 뷰 템플릿) (0) | 2022.08.14 |
스프링 MVC 1 - HTTP 요청 메시지(JSON) (0) | 2022.08.14 |