ContentNegotiatingViewResolver 이해하기

프로그래밍/Spring MVC 2013. 9. 4. 11:44

ContentNegotiatingViewResolver 이해하기


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
: