HTTP 메시지 컨버터는 어디에서 사용되는 것일까?
- RequestMappingHandlerAdapter (요청 매핑 핸들러 어댑터)
- 애노테이션 기반의 컨트롤러, 즉 @RequestMapping을 처리하는 핸들러 어댑터이다.
- 애노테이션 기반의 컨트롤러는 매우 다양한 파라미터를 사용할 수 있었다.
- HttpServletRequest , Model 은 물론이고, @RequestParam , @ModelAttribute 같은 애노테이션 뿐 아니라, @RequestBody , HttpEntity 같은 HTTP 메시지를 처리하는 부분까지. 매우 큰 유연함을 보여주었다.
→ 이렇게 유연하게 파라미터를 처리할 수 있는 이유가 바로 ArgumentResolver 덕분이다!
1. 애노테이션 기반 컨트롤러를 처리하는 RequestMappingHandlerAdapter는 이 ArgumentResolver를 호출해서컨트롤러(핸들러)가필요로 하는 다양한 파라미터의 값(객체)을 생성한다.
2. 이렇게 파라미터의 값이 모두 준비되면, 컨트롤러를 호출하면서 값을 넘겨준다.
- 스프링은 30개가 넘는 ArgumentResolver 를 기본으로 제공한다.
3. ReturnValueHandler가 응답 값을 변환하고 처리한다.
- ArgumentResolver와 비슷
- 컨트롤러에서 String으로 뷰 이름을 반환해도, 동작하는 이유가 바로 ReturnValueHandler 덕분
- 스프링은 10여개가 넘는 ReturnValueHandler 를 지원한다. 예) ModelAndView , @ResponseBody , HttpEntity , String
- ArgumentResolver의 동작 방식
- ArgumentResolver의 supportsParameter() 를 호출해서 해당 파라미터를 지원하는지 체크하고, 지원하면 resolveArgument() 를 호출해서 실제 객체를 생성한다. 그리고 이렇게 생성된 객체가 컨트롤러 호출시 넘어가는 것이다.
- 직접 이 인터페이스를 확장해서 원하는 ArgumentResolver 를 만들 수도 있다. (실제 확장하는 예제는 향후 로그인 처리에서 진행)
애노테이션 기반의 컨트롤러가 처리할 수 있는 파라미터 목록?
Method Arguments :: Spring Framework
- HTTP 메시지 컨버터는 어디쯤 있을까?
- HTTP 메시지 컨버터를 사용하는 @RequestBody도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다. (→ArgumentResolver 필요) @ResponseBody의 경우도 컨트롤러의 반환 값을 이용한다. (→ReturnValueHandler 필요)
- 요청의 경우
- @RequestBody를 처리하는 ArgumentResolver가 있고, HttpEntity를 처리하는 ArgumentResolver가 있다.
- 이 ArgumentResolver들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성
- 응답의 경우
- @ResponseBody와 HttpEntity를 처리하는 ReturnValueHandler 가 있다. 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
- 스프링 MVC는 @RequestBody @ResponseBody 가 있으면 RequestResponseBodyMethodProcessor (ArgumentResolver)를, HttpEntity 가 있으면 HttpEntityMethodProcessor (ArgumentResolver)를 사용
- 요청의 경우
- HTTP 메시지 컨버터를 사용하는 @RequestBody도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다. (→ArgumentResolver 필요) @ResponseBody의 경우도 컨트롤러의 반환 값을 이용한다. (→ReturnValueHandler 필요)
- 스프링은 다음을 모두 인터페이스로 제공한다. →필요하면 언제든지 기능을 확장할 수 있다.
- HandlerMethodArgumentResolver
- HandlerMethodReturnValueHandler
- HttpMessageConverter
- 스프링이 필요한 대부분의 기능을 제공하기 때문에 실제 기능을 확장할 일이 많지 않다!
- 기능 확장은 WebMvcConfigurer 를 상속 받아서 스프링 빈으로 등록하면 된다. (실제 기능 확장이 필요할 땐 WebMvcConfigurer 를 검색해보자.)
[스프링MVC 27] 스프링 MVC 구조 (tistory.com)
728x90
반응형
'Spring Tutorial' 카테고리의 다른 글
[스프링MVC -상품 관리 웹 개발 3] 상품 상세 (0) | 2023.08.30 |
---|---|
[스프링MVC -상품 관리 웹 개발 2] 상품 목록 - 타임리프 (0) | 2023.08.29 |
[스프링MVC 기본 기능 10] HTTP 메시지 컨버터 (0) | 2023.08.26 |
[스프링MVC 기본 기능 9] HTTP 응답 데이터 (0) | 2023.08.24 |
[스프링MVC 기본 기능 8] HTTP 요청 메시지 - JSON (0) | 2023.08.23 |