본문 바로가기

프로그래밍/Spring

<mvc:annotation-driven />이 설정해주는 Spring 설정 Tag

흔히 Spring Web MVC 프로젝트를 할때 보면 <mvc:annotation-driven /> 을 많이 설정하는 편이다. 이거 하나를 설정함으로써 Spring Web MVC를 하기 위해 설정해야 하는 값들이 자동으로 추가 되는데 때로는 이것을 쓰지 않고 일일이 관련된 값을 수동으로 넣어야 하는 경우가 있다. 내가 겪은 대표적인 예로는 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter(줄여서 AnnotationMethodHandlerAdapter로 한다)에 메시지 컨버터를 추가해야 하는 상황이 있었는데 mvc 태그에서 별도로 추가를 할 수 있는 태그를 제공하질 않았다.(이 부분은 Spring 3.1에서는 별도 태그가 추가가 된 상태다) 그래서 <mvc:annotation-driven />을 지우고 내가 별도로 추가를 해야 하는데 문제는 이게 과연 어떤 클래스들을 어떻게 추가했는지 한눈에 감이 잘 안왔다. 그래서 STS(Spring Tool Suite)를 통해 <mvc:annotation-driven />이 내부적으론 다음의 태그가 추가 됨을 알수 있었다

<beans:bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<beans:bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<beans:bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
	<beans:property name="conversionService" ref="conversionService" />
	<beans:property name="validator" ref="validator" />
</beans:bean>
<beans:bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<beans:bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
	<beans:property name="webBindingInitializer" ref="webBindingInitializer" />
	<beans:property name="messageConverters">
		<beans:list>
			<beans:bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
			<beans:bean class="org.springframework.http.converter.StringHttpMessageConverter" />
			<beans:bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
			<beans:bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
			<beans:bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
			<beans:bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
			<beans:bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
		</beans:list>
	</beans:property>
</beans:bean>
<beans:bean class="org.springframework.web.servlet.handler.MappedInterceptor">
	<beans:constructor-arg index="0"><beans:null /></beans:constructor-arg>
	<beans:constructor-arg index="1">
		<beans:bean class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor">
			<beans:constructor-arg index="0" ref="conversionService"/>
		</beans:bean>
	</beans:constructor-arg>
</beans:bean>
<beans:bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" />

 

앞에 beans가 붙은것은 STS에서 MVC 프로젝트를 만들면 Web Context 설정파일의 기본 네임스페이스가 mvc가 되기때문에 그렇다. 만약 기본 네임스페이스가  beans이면 일반적으로 우리에게 익숙한 bean 으로 태그를 시작하면 된다.
현재로서는 <mvc:annotation-driven /> 대신 저걸로 바꿔도 별 지장이 없었다. @NumberFormat 같은 Formatter 어노테이션도 잘 작동되었다. 만약 <mvc:annotation-driven />을 통해 기본적으로 설정되는 것을 바꾸고자 할때는 위의 내용으로 대신 셋팅한뒤에 자신이 만든것을 추가하면 된다.