ContentNegotiatingViewResolver 이해하기
프로그래밍/Spring MVC 2013. 9. 4. 11:44ContentNegotiatingViewResolver 이해하기
ContentNegotiatingViewResolver 는 View 를 찾기위해 요청 URL의 확장자와 AcceptHeader를 사용하는 ViewResolver 입니다.
자체적으로 View 를 찾지는 않으며 viewResolvers 에 설정된 ViewResolver 를 사용하여 View 를 찾습니다.
ContentNegotiatingViewResolver의 기본적인 설정방법은 아래와 같습니다.
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!-- 확장자와 contentType 을 연결해 준다. -->
<property name="mediaTypes">
<map>
<entry key="atom" value="application/atom+xml"/>
<entry key="html" value="text/html"/>
<entry key="json" value="application/json"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
<!-- 위의 viewResolvers 에 의해 view를 얻지 못했을 경우에 사용되는 view -->
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
<property name="defaultContentType" value="application/json" />
</bean>
mediaType 은 URL 의 확장자와 contentType 을 연결해주는 일종의 맵입니다.
http://localhost/user.html 이 들어왔을 경우에는 URL 의 확장자인 html 에 연결된 text/html (ContentType) 을 처리하는 View 를 찾게되고
http://localhost/user.json 이 요청되었을 경우에는 위와 마찬가지로 URL의 확장자인 json 과 연결된 application/json (ContentType) 을 처리하는 View 를 찾습니다.
viewResolvers ContentNegotiatingViewResolver 가 View 를 찾기위해 사용하는 ViewResolver 들
defaultViews 는 viewResolvers 에 의해 view 를 찾지 못했을 경우에 사용되는 view 입니다.
json 이 MappingJacksonJsonView 와 연결되는 방법
org.springframework.web.servlet.View
org.springframework.web.servlet.AbstractView
org.springframework.web.servlet.view.json.MappingJacksonJsonView
MappingJacksonJsonView 상속 관계를 보면 최상위에 org.springframework.web.servlet.View 인터페이스가 있습니다.
org.springframework.web.servlet.View 인터페이스 내에는 해당 View 가 처리할 수 있는 ContextType 를 정의해야 하는 getContentType() 메소드가 있는데 여기서 리턴되는 값을 통해서 해당 View 가 처리해야할 ContentType 을 정의하고 있습니다.
MappingJacksonJsonView 에서 직접적으로 getContentType() 메소드를 구현하지 않는데 구현은 AbstractView 에 이미 들어가 있습니다.
AbstractView 소스를 들여다보면 setContextType( String contextType), getContextType() 메소드가 존재합니다.
따라서 MappingJacksonJsonView 에서는
setContentType( "application/json"); 메소드로 해당 View 에서 처리해야할 ContextType을 정의하게 됩니다.
'프로그래밍 > Spring MVC' 카테고리의 다른 글
@ResponseBody 이해하기 (3) | 2013.09.04 |
---|---|
Spring AOP를 사용하여 DB 트랜잭션시 주의점 (0) | 2013.08.19 |
Spring MVC - fileupload (0) | 2009.12.24 |
Spring MVC - Themes (0) | 2009.12.23 |
Spring MVC - Locale (0) | 2009.12.23 |