[Spring] 메세지 컨버터는 어떻게 동작할까 1

메세지 컨버터는 어떻게 동작할까 - 1

메세지 컨버터 등록

메세지 컨버터의 등록은 스프링 MVC 설정에서 가능합니다. WebMvcConfigurer를 상속하고 @EnableWebMvc 어노테이션을 추가해야 합니다. 메세지 컨버터는 두 가지 방식으로 등록할 수 있도록 지원하고 있습니다.

  • configureMessageConverters

요청 본문과 응답 본문에 포함될 메세지를 설정하는데 사용됩니다. 별도로 설정하지 않으면 기본 설정으로 대체됩니다.

  • extendMessageConverters

설정 이외에 추가적으로 사용될 메세지 컨버터를 등록하는데 사용됩니다.

이렇게 설정된 기본 설정들은 DelegatingWebMvcConfiguration.classsetConfigurers에서 설정들이 추가되게 됩니다.
setConfigurersWebMvcConfigurerComposite에 등록된 WebMvcConfigurer들을 리스트로 관리하게 됩니다.

그 이후에 WebMvcConfigurationSupport.class에서 RequestMappingHandlerAdapter 빈을 생성하면서 메세지 컨버터를 등록하게 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
protected final List<HttpMessageConverter<?>> getMessageConverters() {
if (this.messageConverters == null) {
this.messageConverters = new ArrayList();
this.configureMessageConverters(this.messageConverters); //등록된 설정들에 메세지 컨버터 설정이 있으면 해당 메세지 컨버터를 등록합니다
if (this.messageConverters.isEmpty()) {
this.addDefaultHttpMessageConverters(this.messageConverters); //없다면 기본 컨버터들이 등록됩니다
}

this.extendMessageConverters(this.messageConverters); //추가적으로 사용될 메세지 컨버터들을 등록합니다.
}

return this.messageConverters;
}

기본 설정들에 컨버터 관련 설정들이 없다면 디폴트 컨버터들이 등록이 되는데 대표적으로 ByteArrayHttpMessageConverter StringHttpMessageConverter ResourceHttpMessageConverter ResourceRegionHttpMessageConverter 등등.. 이 등록됩니다. (WebMvcConfigurationSupport.classaddDefaultHttpMessageConverters 메소드 참조)

this.configureMessageConverters(this.messageConverters)를 타고 들어가면 WebMvcConfigurerComposite의 기본 설정들의 메세지 컨버터들을 등록하는 모습을 볼 수 있습니다.

1
2
3
4
5
6
7
8
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Iterator var2 = this.delegates.iterator();

while(var2.hasNext()) {
WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
delegate.configureMessageConverters(converters); //설정의 컨버터들을 타고 들어가 메세지 컨버터를 등록
}
}

이렇게 RequestMappingHandlerAdapter이 생성되고 난 후에는 afterPropertiesSet 메소드가 호출되며 argumentResolvers를 생성하게 되는데, 이 때 @RequestBody에 값을 컨버팅할 메세지 컨버터를 AbstractMessageConverterMethodArgumentResolver에 등록하게 됩니다.

Reference

메세지 컨버터는 어떻게 동작할까 2

메세지 컨버터는 어떻게 동작할까 3

메세지 컨버터는 어떻게 동작할까 4

Author: Song Hayoung
Link: https://songhayoung.github.io/2021/06/23/Spring/spring-message-converter-1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.