ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • messageConverter
    BackEnd/스프링 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 를 사용한다.

     

     

     

    반응형

    'BackEnd > 스프링' 카테고리의 다른 글

    필터와 인터셉터  (0) 2021.07.27
    WebFlux  (0) 2021.05.25
    restcontroller  (0) 2021.05.14
    Servlet & 스프링 web.xml 설정 (쉽게 따라하는 자바 웹개발 (백기선))  (0) 2021.01.14
    트랜젝션  (0) 2020.12.06
Designed by Tistory.