BackEnd/스프링

messageConverter

ssseung 2020. 11. 22. 18:38

ajax 로 응답을 주고 받을 때 json 설정은 MappingJackson2HttpMessageConverter 를 이용해서 

해오다, 같은 로직을 처리하지만 페이지마다 데이터형식을 다르게 보낼 때 메서드를 나누어 만들지 않도록 

ContentNegotiatingViewResolver를 이용할 수 있다.

 

<bean class="org.springframework.http.converter.StringHttpMessageConverter">

<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

 

ContentNegotiatingViewResolver 은 하나의 url 로 다양한 contentType 으로 응답할 수 있도록 한다.

 

<!-- ContentType 자동 매칭 후 View 연결 -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
	<property name="contentNegotiationManager">
          <bean id="contentNegotiationManaver" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
              <property name="favorPathExtension" value="true" />
              <property name="favorParameter" value="false" />
              <property name="parameterName" value="mediaType" />
              <property name="ignoreAcceptHeader" value="false" />
              <property name="defaultContentType" value="text/html" />
              <property name="useJaf" value="false" />
               <!-- 맵핑될 확장자 정의 -->
              <property name="mediaTypes">
                <map>
                  <entry key="json" value="application/json"></entry>
                  <entry key="json" value="text/plain"></entry>
                </map>
              </property>
          </bean>
     </property>
         <property name="order" value="1"/>
         <property name="defaultViews">
          	 <list>
             <!-- JSON 요청을 처리할 뷰 -->
          		<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
           			<property name="prefixJson" value="false"/>
           		</bean>
          	 </list>
         </property>
    </bean>
    
<!-- bean을 viewResolver로 사용 -->   
    <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
         <property name="order" value="0"></property>
    </bean>

<!-- 맵핑되는 확장자가 없을때 JSP 로 뷰 처리 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp" />
        <property name="suffix" value=".jsp" />
        <property name="order" value="2" />
    </bean>

 

contentNegotiaingViewResolever 는 아래와 같은 사항들을 고려해 return 형식을 결정한다.

1. URL 뒤에 붙는 확장자

2. URL의 특정 파라미터에 설정되는 값

3. Request Header 중 Accept 항목에 설정되어 있는 값

4. 1,2,3을 모두 사용하지 않을 경우 defaultContentType 프로퍼티에서 정해진 값 

 

동일 URL 을 이용해 다양한 데이터타입을 받고록 하려면 1,2 는 사용하지 못하고 3번을 이용해야 한다.

 

 

favorPathExtention 은 디폴트가 true 인데 true 는 리턴 형식 기준을 URL 로 보고 URL 에서 MediaType 을 구해 그것을 리턴한다. 

 

parameterName이란 url 형식을 .do?format=xml 으로 하면 format 파라미터 값을 읽어 리턴형식을 결정한다. 디폴트는 format 으로 설정되어 있다.

 

ignoreAcceptHeader 프로퍼티의 값을 false 로 설정하면

contentNegotiaingViewResolever가 accept 항목 값을 보고 리턴 값을 결정한다.

 

이런 설정을 모두 거쳐 defaultContentType 프로퍼티를 보고 판단한다.

 

그리고 이 조건들에 모두 만족하지 못하면 다음 순위의 viewResolver 를 사용한다.

 

 

 

반응형