ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링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);

    }