프레임워크/스프링&스프링부트

[Spring Boot]ContentNegotiatingViewResolver

ContentNegotiatingViewResolver?

ContentNegotiatingViewResolver은 무엇일까? 하는 역할은 무엇일까?

우선 ContentNegotiatingViewResolver은 View를 찾기 위해 요청 URL의 확장자와 AcceptHeader를 사용하는 ViewResolver이다.

 

여기서 ViewResolver은 사용자에게 렌더링한 결과를 보여주기 위한 클래스로 그 중 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>

Property

ContentNegotiatingViewResolver으로 등록된 bean의 속성을 살펴보면 다음과 같은 내용을 알 수 있다.

  1. mediaType : url의 확장자와 content타입을 일종의 맵으로 연결
  2. viewResolvers : ContentNegotiatingViewResolver는 다른 Resolver에게 위임을 하기 위한 VewResolver 리스트
  3. defaultViews : viewResolvers에서 view를 찾지 못했을때 사용되는 기본 view