Programming/Spring

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

성일만 2014. 12. 8. 15:39

@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 설정을 하게 되면 디폴트 전략을 사용할 수 없다고 

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