본문 바로가기
Framework/Spring

[Spring] 펌 / @ResponseBody와 jackson을 이용하여 JSON 사용하기

by 나비와꽃기린 2016. 7. 12.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ajax를 호출하여 @ResponseBody로 data를 view에 전달하려 하였는데

계속 406 Error가 나서 찾아보니 , ,,,,,,,,,, Spring 설정에 따라 jackson lib를 추가하라고 하더라.

관련된 좋은 글이 있길래 가져왔다. 참고하자!


출처 : http://seongilman.tistory.com/117


@ResponseBody와 jackson을 이용하여 JSON 사용하기



@ResponseBoady란?

메서드에 @ResponseBody Annotation이 되어 있으면 return되는 값은 View를 통해서

출력되는 것이 아니라 HTTP Response Body에 직접쓰여지게 된다.


MessageConverter의 종류

- StringHttpMessageConverter

- FormHttpMessageConverter

- ByteArrayMessageConverter

- MarshallingHttpMessageConverter

- MappingJacksonHttpMessageConverter

내가 사용할건 MappingJacksonHttpMessageConverter 다. 다른건 나중에 알아봐야지..


jackson maven dependency

<dependency>

<groupId>org.codehaus.jackson</groupId>

<artifactId>jackson-mapper-asl</artifactId>

<version>1.9.13</version>

</dependency>


server-context.xml jackson을 위한 bean 설정

<bean id="jacksonMessageConverter"class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>


Controller

@RequestMapping(value = "/jsontest")

public @ResponseBody Object jsonTest(){

BoardVO vo = new BoardVO();

vo.setId("seongilman");

vo.setTitle("board title");

vo.setContent("board Content");

return vo;

}


jsp

<a href="/jsontest">click</a>


결과

{"id":"seongilman","title":"board title","content":"board Content"}



2015. 01. 26 추가

<mvc:annotation-driven/> 하위에 message-converters를 설정하지도 않고,

Jackson Bean 선언을 지웠는데도 @RequestBody와 @ResponseBody가 오류 없이 정상 작동했다.

라이브러리만 가지고 있고, 아무 설정을 하지 않았는데 어떻게 사용이 가능했다.


알아보니 스프링 3.1 부터는 AnnotationMethodHandlerAdapter 의 messageConverters 프로퍼티로 메시지 컨버터들이 등록된다고 하는데

위의 네 개의 디폴트 메시지 컨버터와 함께 Jaxb2RootElementHttpMessageConverter 와 MappingJacksonHttpMessageConverter가

추가로 등록된다고 한다. 단, 각각 JAXB2 와 Jackson 라이브러리가 클래스 패스에 존재하는 경우에만 등록된다고 한다.


<context:annotation-config/> 로도 annotation 을 읽기 위해 사용하지만 HttpMessageConverter 를 위해  

<mvc:annotation-driven/> 을 사용하면 HttpMessageConverter 를 기본적으로 자동 등록한다고 한다.


결론

annotation스캔을 <mvc:annotation-driven/> 로 하고 있다면 HttpMessageConverter를 기본적으로

등록하기 때문에 별다른 설정없이 Jackson 라이브러리만 추가하면 디폴트 전략인 Jackson Json을 사용할 수 있다는 것.

<mvc:annotation-driven/> 하위에 message-converters 설정을 하게 되면 디폴트 전략을 사용할 수 없다고 

토비의 스프링에 나와있는 걸 보면 스프링 기본 전략을 사용하느냐, 내가 직접 전략을 짜느냐(?)의 차이인 것 같다.