Spring

[Spring] Spring MVC - 요청 매핑 헨들러 어뎁터 구조

동그리담 2024. 5. 8. 10:51

애노테이션 기반의 컨트롤러, @RequestMapping을 처리하는 핸들러 어댑터 RequestMappingHandlerAdapter의 동작방식을 보자.

ArgumentResolver

RequetstMappingHandlerAdapter는 Argument Resolver를 호출해서 컨트롤러(핸들러) 필요로 하는 파라미터 값과 객체를 생성한다. 그리고 이렇게 파리미터의 값이 모두 준비되면 컨트롤러를 호출하면서 값을 넘겨준다.

정확히는 HandlerMethodArgumentResolver 인데 줄여서 ArgumentResolver 라고 부른다.

가능한 파라미터 목록은 다음 공식 메뉴얼에서 확인할 수 있다. (30여개)

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments

작동 방식

  1. ArgumentResolver 의 supportsParameter() 를 호출해서 해당 파라미터를 지원하는지 체크
  2. 지원하면 resolveArgument() 를 호출해서 실제 객체를 생성후 반환

RetunValueHandler

HandlerMethodReturnValueHandler를 줄여서 ReturnValueHandler라 부른다.

응답 값을 변환하고 처리하는 인터페이스 이다.

컨트롤러에서 String으로 뷰 이름을 반환해도 동작하게 해주는 것이 이 인터페이스이다.

ReturnValueHandler는 ModelAndView, @ResponseBody, HttpEntity, String 포함 10개를 지원한다.

가능한 응답 값 목록은 다음 공식 메뉴얼에서 확인할 수 있다.

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types

HTTP 메시지 컨버터 위치

요청의 경우

@RequestBody를 처리하는 ArgumentResolver가 있고 HttpEntity를 처리하는 ArgumentResolver가 있다.
이 ArgumentResolver들이 HTTP 메시지 컨버터를 사용해서 필요한 객체를 생성한다.

응답의 경우

이 경우에도 @ResponseBody와 HttpEntity를 처리하는 ReturnValueHandler가 있다.
여기에서 HTTP 메시지 컨버터를 호출해서 응답 결과를 만든다.

스프링 MVC는 @RequestBody, @ResponseBody가 있으면
RequestResponseBodyMethodProcessor (ArgumentResolver)

HttpEntity가 있으면 HttpEntityMethodProcessor (ArgumentResolver)를 사용한다.

HttpMessageConverter를 구현한 클래스를 확인해보면 매우 많은 수가 있는 것을 확인할 수 있다.

확장

스프링은 ArgumentResolver,  ReturnValueHandler, HttpMessageConverter를 인터페이스로 제공하기 때문에
필요한 경우 WebMvcConfigUser를 상속받아서 스프링 빈으로 등록해서 확장하면된다.

@Bean
public WebMvcConfigurer webMvcConfigurer() {
 return new WebMvcConfigurer() {
 @Override
 public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
 //...
 }
 @Override
 public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
 //...
 }
 };
}