코드 그라데이션
요청 매핑 핸들러 구조 본문
요청 매핑 핸들러 구조
- HTTP 메시지 컨버터는 스프링 MVC 어디쯤에서 사용되는 것일까?
이 구조에서는 없다.
SpringMVC 구조
모든 비밀은 애노테이션 기반의 컨트롤러, 그러니까 @RequestMapping 을 처리하는 핸들러 어댑터인
RequestMappingHandlerAdapter (요청 매핑 헨들러 어뎁터)에 있다.
RequestMappingHandlerAdapter 동작 방식
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-annarguments
정확히는 HandlerMethodArgumentResolver / 현재 축약해서 ArgumentResolver
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
@Nullable
Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}
동작 방식
ReturnValueHandler
참고
> 가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다.
> https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-annreturn-types
HTTP 메시지 컨버터 => ArgumentResolver가 사용함
HTTP 메시지 컨버터 위치
HTTP 메시지 컨버터는 어디쯤 있을까?
- HTTP 메시지 컨버터를 사용하는 @RequestBody 도 컨트롤러가 필요로 하는 파라미터의 값에 사용된다.
- @ResponseBody 의 경우도 컨트롤러의 반환 값을 이용한다.
요청의 경우
- @RequestBody 를 처리하는 ArgumentResolver 가 있고, HttpEntity 를 처리하는 ArgumentResolver 가 있다.
이 ArgumentResolver 들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성하는 것이다.
응답의 경우
- @ResponseBody 와 HttpEntity 를 처리하는 ReturnValueHandler 가 있다.
그리고 여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.
스프링 MVC는
- @RequestBody @ResponseBody 가 있으면 RequestResponseBodyMethodProcessor (ArgumentResolver)
- HttpEntity 가 있으면 HttpEntityMethodProcessor (ArgumentResolver)를 사용한다.
확장
스프링은 다음을 모두 인터페이스로 제공한다. 따라서 필요하면 언제든지 기능을 확장할 수 있다.
스프링이 필요한 대부분의 기능을 제공하기 때문에 실제 기능을 확장할 일이 많지는 않다.
기능 확장은 WebMvcConfigurer 를 상속 받아서 스프링 빈으로 등록하면 된다.
실제 자주 사용하지는 않으니 실제 기능 확장 필요할 때 WebMvcConfigurer 를 검색하면 된다.
WebMvcConfigurer 확장
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
//...
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//...
}
};
}
'Spring > MVC 1' 카테고리의 다른 글
웹 페이지 만들기 (2) 상품 서비스 HTML (1) | 2023.10.30 |
---|---|
웹 페이지 만들기 (1) 요구사항 분석 및 상품 도메인 개발 (0) | 2023.10.30 |
HTTP 메시지 컨버터 (1) | 2023.10.28 |
HTTP 응답 - HTTP API, 메시지 바디에 직접 입력 (0) | 2023.10.10 |
HTTP 응답 - 정적 리소스, 뷰 템플릿 (1) | 2023.10.10 |