-
스프링4.0 - XML/JSON 변환처리웹프로그래밍/spring 2018. 7. 19. 20:25
- @RequestBody / @ResponseBody으로 요청/응답 데이터 변환하기
웹브라우저와 웹 서버 간 데이터를 주고 받는 http 프로토콜의 request와 response는 모두 헤더와 몸체로 구성되어있다.
헤더에는 설정 정보가 저장되고 몸체에는 타입을 가진 객체가 데이터로 담긴다.
뷰 클래스나 HttpServlerResponse에 직접 응답을 생성하는 방법 대신
request/response 몸체에 담긴 데이터를 @RequestBody / @ResponseBody으로 간단하게 변환할 수 있다.
@RequestBody / @ResponseBody는 각각 요청/응답 몸체와 관련되어 있다.
예를들어 @RequestBody는 요청 파라미터의 문자열을 자바의 스트링 타입으로 변환하거나 JSON 형식을 자바 객체로 변환할대 사용한다.
반대로 응답 몸체를 자바 객체에서 JSON이나 XML로 변환할때 @ResponseBody를 사용한다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/mc/simple")
public class SimpleConverterController {
@RequestMapping(method = RequestMethod.GET)
public String simpleForm() {
return "mc/simple";
}
@RequestMapping(method = RequestMethod.POST)
@ResponseBody
//@RequestBody는 post방식으로 전송된 request의 몸체 데이터를 String 타입의 객체로 변환해서 body 파라미터로 전달한다.
public String simple(@RequestBody String body) {
//@ResponseBody에 의해서 simple()메서드의 리턴 값을 String 타입의 객체로 응답 데이터로 전송한다.
return body;
}
}
- HttpMessageConverter의 변환처리
스프링 MVC는 @RequestBody / @ResponseBody으로 요청/응답 데이터 변환 처리시에 HttpMessageConverter를 이용한다.
예를 들어, String 타입으로 변환 할때 StringHttpMessageConverter 클래스를 사용한다.
위 클래스처럼 데이터 타입 별로 HttpMessageConverter인터페이스를 구현하는 다양한 타입의 클래스가 있는데
아래 코드로 일괄 등록할 수 있다.
<annotation-driven>
- JAXB2를 이용한 XML처리
JAXB2는 자바 객체와 XML 사이의 변환을 처리하는 API이다.
지원하는 HTTP 요청의 컨텐트 타입은 text/xml, application/xml, application/*+xml 이다.
아래 코드는 @RequestBody로 요청 데이터를 xml에서 JAXB2 기반의 자바 객체로 변환하거나
@ResponseBody로 자바 객체를 xml 응답으로 변환한다.
GuestMessagList 클래스가 XML로 변환된다.
웹 브라우저에서 요청 몸체에 XML을 담으려면 자바스크립트를 이용하여 Ajax로 요청 몸체를 전송해야 한다.
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
//루트 엘리먼트가 <message-list>인 XML 생성
@XmlRootElement(name = "message-list")
public class GuestMessageList {
//서브? 엘리먼트
@XmlElement(name = "message")
private List<GuestMessage> messages;
public GuestMessageList() {
}
public GuestMessageList(List<GuestMessage> messages) {
this.messages = messages;
}
public List<GuestMessage> getMessages() {
return messages;
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class GuestMessageController {
@RequestMapping(value = "/guestmessage/list.xml")
@ResponseBody
public GuestMessageList listXml() {
return getMessageList();
}
@RequestMapping(value = "/guestmessage/post.xml", method = RequestMethod.POST)
@ResponseBody
public GuestMessageList postXml(@RequestBody GuestMessageList messageList) {
return messageList;
}
private GuestMessageList getMessageList() {
List<GuestMessage> messages = Arrays.asList(
new GuestMessage(1, "메시지", new Date()),
new GuestMessage(2, "메시지2", new Date())
);
return new GuestMessageList(messages);
}
- Jackson2를 이용한 JSON 처리
MappingJackson2HttpMessageConverter가 자바 객체와 JSON 간의 변환을 처리한다.
-의존 설정 추가
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.3.3</version>
</dependency>
Jackson2 의존 추가만 하면 필요한 설정은 끝이다.
자바 객체를 JSON 응답으로 처리하려면 리턴 타입으로 자바 객체를 리턴한다.
@RequestMapping(value = "/guestmessage/list.json")
@ResponseBody
public GuestMessageList2 listJson() {
return getMessageList2();
}
private GuestMessageList2 getMessageList2() {
List<GuestMessage> messages = Arrays.asList(
new GuestMessage(1, "메시지", new Date()),
new GuestMessage(2, "메시지2", new Date())
);
return new GuestMessageList2(messages);
}
'웹프로그래밍 > spring' 카테고리의 다른 글
스프링4.0 - 뷰 규현 : 커스텀태그 정리 (0) 2018.07.21 스프링4.0 - MVC : 뷰 구현 (0) 2018.07.21 스프링4.0-WebApplicationContext 계층 : 다수의 DispatcherServlet 설정 (0) 2018.07.18 스프링 4.0 - 정적 자원 설정하기 (ex. 이미지파일 경로 맵핑) (0) 2018.07.18 스프링4.0- 익셉션 처리 (0) 2018.07.18