Development/Java

[Spring] JSON Object 관련

반응형

이전 포스팅에도 Spring에서 객체를 Wrapping해주는 JSON Mapper에 대해 기술한 적이 있는데


좀더 자세히 사용법을 알아보고자 작성해본다.


JAVA에서 객체를 박싱/언박싱할때 사용하는 라이브러리는 주로 다음과 같다


java json performance comparison에 대한 이미지 검색결과


  • org-json
  • gson
  • jackson
  • json-simple
  • minimal-json
일단 왜 JSON 라이브러리가 중요한가 보면, JSON(Javascript Object Notation)은 현재 여러 플랫폼에서 통용되는 데이터 타입이라고 볼 수 있는데,
서버 <-> 클라이언트에 사용되는 주요 메세지 포맷이다.

데이터를 송/수신할때 직접 byte단위로 보내도 되지만, 이럴 경우 언어별로 각기 다른 처리를 해줘야 하는 수고로움이 들기도 하고
사람이 알아보기 힘든 면이 있다.
(JSON의 경우 사람이 알아보기 쉬운 구조로 되어 있는 동시에, 컴퓨터가 알아먹기 쉬운 구조로 되어 있다)

따라서.. 주로 웹 어플리케이션 서버 <-> 브라우저, 클라이언트 간의 통신에서 주로 사용을 하게 되는데 

JSON으로 주고 받는건 좋은데, 이럴 때 POJO(자바의 Plain Object)를 바로 클라이언트로 보낼 수 있으면 편리하겠다.. 라는 생각으로 만들어진 놈이다.

즉, 데이터를 담는 컨테이너 클래스를 생성하고 그 클래스를 파싱해서 JSON으로 만들던지, JSON으로 받은 string을 POJO로 변환하는 경우에 사용이 된다.

중요한건 위의 라이브러리는 여러개지만.. Spring에서 채택한 기본 JSON Object Mapper는 "Jackson" 이다.

일단 둘 다 사용하려면 maven이나 gradle 디펜던시가 필요하다.



pom.xml에 아래의 디펜던시를 추가해준다.

간단하게 Jackson, Gson을 많이 사용하니 두개만 테스트해보기로 한다.



아래는 JSON String <-> POJO 박싱/언박싱 테스트




테스트로 사용할 POJO 클래스(Customer)


package jsonLab;

import java.util.List;

/**
 * Created by Gompang on 2017. 3. 26..
 */
public class Customer {

    private String name;
    private int id;
    private List orders;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List getOrders() {
        return orders;
    }

    public void setOrders(List orders) {
        this.orders = orders;
    }

    public Customer(String name, int id, List orders) {
        this.name = name;
        this.id = id;
        this.orders = orders;
    }

    public Customer() {

    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", orders=" + orders +
                '}';
    }
}


POJO <-> JSON String 변환 테스트


package jsonLab;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Gompang on 2017. 3. 26..
 */
public class Formatter {

    ObjectMapper objectMapper;
    Gson gson;


    public Formatter() {
        objectMapper = new ObjectMapper();
        gson = new Gson();
    }

    public void format_jackson(Object obj){
        System.out.println("== Jackson ==");
        try {
            String mappedValue = objectMapper.writeValueAsString(obj);
            System.out.println("toJson : " + mappedValue);

            // format to POJO
            Customer customer = objectMapper.readValue(mappedValue, Customer.class);
            System.out.println("fromJson : " + customer);

        } catch (JsonProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void format_gson(Object obj){
        System.out.println("== Gson ==");
        String mappedValue = gson.toJson(obj);
        System.out.println("toJson : " + mappedValue);

        // format to POJO
        Customer customer = gson.fromJson(mappedValue, Customer.class);
        System.out.println("fromJson : " + customer);
    }

    public static void main(String args[]){
        Formatter formatter = new Formatter();

        Customer customer = new Customer();
        customer.setId(10);
        customer.setName("Gompang");

        List orderList = new ArrayList();
        orderList.add("order1");
        orderList.add("order2");
        orderList.add("order3");

        customer.setOrders(orderList);

        formatter.format_jackson(customer);
        formatter.format_gson(customer);
    }
}



반응형