웹프로그래밍/spring

스프링4.0 - XML/JSON 변환처리

Gamcho 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);

}