코드 그라데이션

요청 매핑 핸들러 구조 본문

Spring/MVC 1

요청 매핑 핸들러 구조

완벽한 장면 2023. 10. 29. 18:53

요청 매핑 핸들러 구조

- 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

 

Redirecting...

 

docs.spring.io

 

정확히는 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

 

Redirecting...

 

docs.spring.io

 

 

 


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) {
//...
}
};
}

 

 

728x90
Comments