본문 바로가기

Spring/Spring MVC

(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

 

(SERVLET) DispatcherServlet의 내부 살펴보기

DispatcheServlet의 doService부터 시작 핸들러 찾기 요청을 찾아올 수 있는 핸들러를 찾아오는 부분 핸들러 매핑 찾기 - 기본으로 두 개의 핸들러 매핑이 제공된다. 두 가지 핸들러 중 찾은 핸들러는 Reques..

jwdeveloper.tistory.com

handlerMapping의 경우에는 interceptor 등을 설정해주고

handlerAdapter의 경우에는 messageConverters 등을 설정해준다.

 


@EnableWebMvc을 설정하고 디버깅을 돌려보자

하지만 이전에 사전 설정이 있다.

servletContext 설정이 추가로 들어간다.

이유는 DelegatingWebMvcConfiguration가 servletContext를 종종 참조하고 있기 때문이다.

 

BeanNameUrlMappingHandler에 이전에 interceptor가 초기화되어있지 않은 것과 달리 초기화되어있다.

 

RequestMappingHandlerMapping 애노테이션 관련 Handler가 우선순위가 높은 것을 볼 수 있다.

애노테이션 기반 Spring MVC를 사용한다면 굳이 BeanNameUrlHandlerMapping까지 내려가지 않아도 되는 경우가 있기 때문에

성능상 장점이 있다.

 

 

Delegation 구조로 되어있는 이유는 확장성을 좋게하기 위해서이다.

유저가 원하는대로 확장할 수 있게끔 사용할 수 있다.

 

이는 WebMvcConfigurer라는 인터페이스를 통해 지원된다.