WebMvcConfigurationSupport와 @EnableWebMvc의 관계?
이전 @EnableWebMvc에서 중요한 부분을 빼먹은 것 같다.. 바로 WebMvcConfigurationSupport와의 관계이다.
그럼 @EnableWebMvc와 WebMvcConfigurationSupport은 무슨 관계?
@EnableWebMvc의 소스를 보면 다음과 같이 되어 있다.
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }
DelegatingWebMvcConfiguration이라고 되어 있는데 WebMvcConfiguration을 위임 한다고 되어 있는데 이놈도 소스를 열어 봐야 겠다.
@Configuration public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport { … … }
WebMvcConfigurationSupport을 확장하고 있다!? 그렇다면 @EnableWebMvc을 사용하면 DelegatingWebMvcConfiguration을 import하고 있으며 DelegatingWebMvcConfiguration은 WebMvcConfigurationSupport을 확장하고 있다.
아! 바로 이놈이였구나!
이미 WebMvcConfigurationSupport을 확장을 함으로써 @EnableWebMvc에서 설명한대로 내부적으로 자동으로 등록해줬던 bean은 DelegatingWebMvcConfiguration을 import함으로서 자동으로 등록 해줬던 것이다.
하지만 Custom한 설정을 할 방법이 없다. annotation이 등록됨으로써 필요한 mvc bean이 등록이 될 뿐이지 customize하게 configuration이 필요하다면 어쩔것인가? 아무리 springframework에서 내부적으로 확장을 한들 @Configuration에서는 사용할 방법이 없다..
그렇다면 어떻게 ?
답은 이미 @EnableWebMvc에서 설명을 했었다. 바로 WebMvcConfigurAdapter을 implement을 하는 것이다. 이 interface을 구현으로서 WebMvcConfigurationSupport와 adapter(중개자?)해준다.
public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer { public void addFormatters(FormatterRegistry registry) { } public void configureMessageConverters(List> converters) { } public Validator getValidator() { return null; } public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } public void configureAsyncSupport(AsyncSupportConfigurer configurer) { } public void addArgumentResolvers(List argumentResolvers) { } public void addReturnValueHandlers(List returnValueHandlers) { } public void configureHandlerExceptionResolvers(List exceptionResolvers) { } public MessageCodesResolver getMessageCodesResolver() { return null; } public void addInterceptors(InterceptorRegistry registry) { } public void addViewControllers(ViewControllerRegistry registry) { } public void addResourceHandlers(ResourceHandlerRegistry registry) { } public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { } }
그리고 위에서 보시다시피 adapter가 모든 부분에 대해서 customize설정을 지원해주는 건 아니다. 만일 자동으로 등록되는 RequestMappingHandlerAdapter을 custermize하겠다면 어쩌겠는가?
이럴땐 간단하게 @EnableWebMvc을 지우고 바로 WebMvcConfgurationSupport을 확장해버리자!
@Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override public void addInterceptors(InterceptorRegistry registry){ // ... } @Override @Bean public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { // Create or let "super" create the adapter // Then customize one of its properties } }











