(SERVLET) 스프링 MVC 빈 설정
low-level 방식의 직접 Bean으로 등록하는 방식
예시
HandlerMapping intercepter 설정
@Bean
public HandlerMapping handlerMapping() {
RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
handlerMapping.setInterceptors();
return handlerMapping;
}
이렇게 일일이 Bean으로 등록하는 방식이 있다는 것만 알아두자! - 요즘엔 이렇게 쓰지 않는다.
@EnableWebMvc
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
DelegatingWebMvcConfiguration을 import 한다.
해당 클래스의 내부는
WebMvcConfigurationSupport를 상속받고 있다. 이 클래스에서 실질적인 Bean들이 등록되어 있다.
상속받는 클래스에만 interceptor를 등록하도록 설정돼있다.
protected void addInterceptors(InterceptorRegistry registry) {
}
기본적으로 설정되어있는 interceptor
protected final Object[] getInterceptors() {
if (this.interceptors == null) {
InterceptorRegistry registry = new InterceptorRegistry();
addInterceptors(registry);
registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService()));
registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider()));
this.interceptors = registry.getInterceptors();
}
return this.interceptors.toArray();
}
기본적으로 @EnableWebMvc를 설정하지 않고 기본적으로 어떤 Bean들이 등록되는지 디버깅을 통해 살펴보자
: 현재는 Bean을 직접 등록하는 단계이며 Bean으로 등록하지 않은 것은 DispatcheServlet.properties에 있는 기본 값들을 사용하게 된다.
https://jwdeveloper.tistory.com/117?category=835408
handlerMapping의 경우에는 interceptor 등을 설정해주고
handlerAdapter의 경우에는 messageConverters 등을 설정해준다.
@EnableWebMvc을 설정하고 디버깅을 돌려보자
하지만 이전에 사전 설정이 있다.
servletContext 설정이 추가로 들어간다.
이유는 DelegatingWebMvcConfiguration가 servletContext를 종종 참조하고 있기 때문이다.
BeanNameUrlMappingHandler에 이전에 interceptor가 초기화되어있지 않은 것과 달리 초기화되어있다.
RequestMappingHandlerMapping 애노테이션 관련 Handler가 우선순위가 높은 것을 볼 수 있다.
애노테이션 기반 Spring MVC를 사용한다면 굳이 BeanNameUrlHandlerMapping까지 내려가지 않아도 되는 경우가 있기 때문에
성능상 장점이 있다.
Delegation 구조로 되어있는 이유는 확장성을 좋게하기 위해서이다.
유저가 원하는대로 확장할 수 있게끔 사용할 수 있다.
이는 WebMvcConfigurer라는 인터페이스를 통해 지원된다.