2010년 11월 04일
스프링 설정 <mvc:annotation-driven/>이 구체적으로 뭘까?
오랜만에...라고 하기엔 정말 오랫동안 블로그에 글을 안 올렸는데 좌우간... 그렇게 오랫동안 안 올리다 올리는 글 치고는 손 안대고 코 푸는 수준의 글이지만 일단 다시 블로그질 좀 하려면 가볍게 시작하는 게 좋겠다는 생각이 들어서... 음...
암튼
스프링 3에 새로 추가된 mvc 네임 스페이스를 쓰면 아주 쉽게 @mvc xml 설정을 할 수는 있지만 속성을 변경할 수 없는 문제도 있다. 그래서 <mvc:annotation-driven>이 정확이 어떤 빈 설정을 의미하는지 찾아봤다.
소스 코드는 org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.java 다.
결론은...
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="0" />
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator" />
<property name="conversionService" ref="conversion-service"/>
</bean>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" >
<property name="writeAcceptCharset" value="false"/>
</bean>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<!-- <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />-->
<!-- <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />-->
<!-- <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter" />-->
<!-- <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter" />-->
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
<constructor-arg index="0"><null/></constructor-arg>
<constructor-arg index="1">
<bean class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor">
<constructor-arg index="0" ref="conversion-service"/>
</bean>
</constructor-arg>
</bean>
암튼
스프링 3에 새로 추가된 mvc 네임 스페이스를 쓰면 아주 쉽게 @mvc xml 설정을 할 수는 있지만 속성을 변경할 수 없는 문제도 있다. 그래서 <mvc:annotation-driven>이 정확이 어떤 빈 설정을 의미하는지 찾아봤다.
소스 코드는 org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser.java 다.
결론은...
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="0" />
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="validator" ref="validator" />
<property name="conversionService" ref="conversion-service"/>
</bean>
</property>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter" >
<property name="writeAcceptCharset" value="false"/>
</bean>
<bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" />
<!-- <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />-->
<!-- <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />-->
<!-- <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter" />-->
<!-- <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter" />-->
</list>
</property>
</bean>
<bean class="org.springframework.web.servlet.handler.MappedInterceptor">
<constructor-arg index="0"><null/></constructor-arg>
<constructor-arg index="1">
<bean class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor">
<constructor-arg index="0" ref="conversion-service"/>
</bean>
</constructor-arg>
</bean>
위에 주석 처리한 컨버터는 해당 라이브러리가 클래스 경로에 있을 때 활성화 된다. 수작업으로 설정할 때는 판단도 수작업으로...
그리고 생소한 MappedInterceptor는 이일민님 블로그 참조.
# by | 2010/11/04 19:27 | 미분류 | 트랙백(1) | 핑백(2) | 덧글(3)
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : Spring MVC 3.1 에서 달라진 <mv..
기존 Spring MVC 3.0.x의 태그의 전략은 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 클래스를 사용하여 맵핑 및 여러 클래스를 추가하여 구성이 되었다. 하지만 이.....more
... 마지막에 디폴트 서블릿 매핑이 잡혀서 잘 구동이 됐습니다. 이얏호! 그러다가 문뜩 생각난 <mvc:annotation-driven/> 구글링 해보니 박성철님의 스프링 설정 이 구체적으로 뭘까?란 포스트가 눈에 들어왔습니다. 읽어보니 @mvc 관련 핸들러, 어탭터를 등록해 주더라구요. 아까의 삽질을 상기 시키며 <mvc:default-servlet- ... more
... ean> 38: </constructor-arg> 39: </bean>일부 컨버터는 별도의 라이브러리가 있어야 작동한다. 출처 : http://gyumee.egloos.com/3056225 ... more