메세지 컨버터는 어떻게 동작할까 - 1
메세지 컨버터 등록
메세지 컨버터의 등록은 스프링 MVC 설정에서 가능합니다. WebMvcConfigurer
를 상속하고 @EnableWebMvc
어노테이션을 추가해야 합니다. 메세지 컨버터는 두 가지 방식으로 등록할 수 있도록 지원하고 있습니다.
- configureMessageConverters
요청 본문과 응답 본문에 포함될 메세지를 설정하는데 사용됩니다. 별도로 설정하지 않으면 기본 설정으로 대체됩니다.
- extendMessageConverters
설정 이외에 추가적으로 사용될 메세지 컨버터를 등록하는데 사용됩니다.
이렇게 설정된 기본 설정들은 DelegatingWebMvcConfiguration.class
의 setConfigurers
에서 설정들이 추가되게 됩니다.setConfigurers
는 WebMvcConfigurerComposite
에 등록된 WebMvcConfigurer
들을 리스트로 관리하게 됩니다.
그 이후에 WebMvcConfigurationSupport.class
에서 RequestMappingHandlerAdapter
빈을 생성하면서 메세지 컨버터를 등록하게 됩니다.
1 | protected final List<HttpMessageConverter<?>> getMessageConverters() { |
기본 설정들에 컨버터 관련 설정들이 없다면 디폴트 컨버터들이 등록이 되는데 대표적으로 ByteArrayHttpMessageConverter
StringHttpMessageConverter
ResourceHttpMessageConverter
ResourceRegionHttpMessageConverter
등등.. 이 등록됩니다. (WebMvcConfigurationSupport.class
의 addDefaultHttpMessageConverters
메소드 참조)
this.configureMessageConverters(this.messageConverters)
를 타고 들어가면 WebMvcConfigurerComposite
의 기본 설정들의 메세지 컨버터들을 등록하는 모습을 볼 수 있습니다.
1 | public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { |
이렇게 RequestMappingHandlerAdapter
이 생성되고 난 후에는 afterPropertiesSet
메소드가 호출되며 argumentResolvers
를 생성하게 되는데, 이 때 @RequestBody
에 값을 컨버팅할 메세지 컨버터를 AbstractMessageConverterMethodArgumentResolver
에 등록하게 됩니다.