Spring을 이용한 RESTful 방식의 서비스를 구현하려다 보니 RESPONSE 데이터 타입에 대한 고민을 하게 되었다.


REST API를 서비스하는 대부분의 사이트(트위터, 페이스북, 포스퀘어 등)의 대부분이 JSON 타입을 기본으로 지원한다.

대부분의 Tutorial, Example 을 보더라도 JSON 형식으로 처리를 하게 끔 되어있다.

아무래도 JSON이 심플하고, 처리 속도도 빠르기 때문에 대세기 때문에 그런듯 하다.


바로 여기서 의문점이 들었다.

다른 타입으로 결과를 만들어서 주고 싶다면 어떻게 해야할까?!

xml, rss, pdf, doc는?!


실제 Twitter REST API 1.1의 샘플을 살펴보니 다음 예와 같이 URI에 따라서 여러가지 형태의 응답결과를 받을 수 있었다.


https://api.twitter.com/1.1/statuses/mentions_timeline.json  (JSON)


https://api.twitter.com/1.1/statuses/mentions_timeline.xml  (XML)


https://api.twitter.com/1.1/statuses/mentions_timeline.rss  (RSS)


그리고


https://api.twitter.com/1.1/statuses/mentions_timeline  (기본 웹 페이지)





Spring MVC 에서는 View단 처리를 하는 Resolver 가 다수 존재하는데 위의 예와 같이 type설정에 따라 응답 결과를 다르게 처리하도록 도와주는 역할을 하는 것이 바로 org.springframework.web.servlet.view.ContentNegotiatingViewResolver 이다.


다음은 spring-context.xml에서 ContentNegotiatingViewResolver 설정 예이다. 

json과 xml을 사용하는 방법에 대해서만 기술한다.


설정후에 서버를 스타트 해보니 로드시 ClassCastException 를 던졌다.

context 파일을 보니 <property name="mediaTypes">에 warning이 떠 있다.


spring-mvc 3.2.x 버전으로 테스트를 하고 있는데 클래스를 찾아가서 mediaTypes와 관련된 메소드를 찾아보니 Deprecated 되어 있다.

ContentNegotiationManager 라는 놈이 3.2부터 생겨 대체되어 있었다.

3.2 공식 문서에는 변경된 내용이 적용이 되어있지 않다. 역시 최신버전을 사용하는건 어렵다...


3.2 이상은 아래와 같이 설정한다.



아래 DTO 모델을 선언할 때 XML 마샬링(Marshalling)을 위해서 아래와 같이 XML 관련 어노테이션을 선언해준다.

@XmlRootElement의 users는 XML생성시에 루트 엘리먼트 이름이 된다. 중복되는 이름이 있을경우에 IllegalAnnotationExceptions 을 던지니 주의해야한다.


마지막으로 Controller 메소드에는 @ResponseBody 어노테이션을 선언하면 리턴하는 객체가 HTTP Response 로 넘어간다.

SampleDTO가 리턴 오브젝트이고 set 해준 값들이 출력된다.

아래는 Controller 선언문이다.




AND