-
messageConverterBackEnd/스프링 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