[Spring] ObjectMapper 왜 사용하는거야? (추가. Gson)

devdo·2021년 12월 30일
0

Spring

목록 보기
11/11

ObjectMapper란?

특정객체를 json으로 바꾸어놓을 때 사용한다.

(직렬화) 또는 그 반대로 바꾸어놓을 때 사용한다.(역직렬화)

스프링에서는 이미 @RequestBody로 객체가 json 으로 바뀌어서 받는다. 그래서 따로 ObjectMapper를 활용하지 않는다.

하지만 Json 자체 데이타에서 컨트롤하는 상황이나 Rest Controller단 테스트코드를 작성할 때 사용할 수 있다.

ObjectMapper로 직접 json 데이타로 만드는 방법을 배워보자.


jar 라이브러리

순수 Java 프로그램에서는 이 3개를 다 깔아줘야 한다.

jackson-databind-2.12.7.1.jar
jackson-core-2.12.7.jar
jackson-annotations-2.12.7.jar

💥 주의!
spring에서 사용하는 objectMapper 디팬더시는 Jackson Databind 이다!
따로 스프링에서 디팬더시를 걸어주지 않아도 된다.
Jackson Databind 디팬더시는 기본적으로 깔려 있다.

  • Jackson은 Java용 견고하고 성숙한 JSON 직렬화/역직렬화 라이브러리이다.
  • ObjectMapper의 API는 많은 유연성과 JSON 응답 객체를 구문 분석하고 생성하는 간단한 방법을 제공하는 것이다.

ObjectMapper 구현방법

  • ObjectMapper로 접근하기

  • 역직렬화를 위해서는 기본생성자가 반드시 필요하다.

1) 객체 -> JSON(String) : 직렬화, Response
writeValueAsString(user)

ObjectMapper objectMapper = new ObjectMapper();

User user = new User();
String json = objectMapper.writeValueAsString(user); // String(json)으로 변환

2) JSON(String) -> 객체 : 역직렬화, Request
readValue (json, User.class)

String json = "{\"name\":\"zooneon\",\"age\":25,\"address\":\"seoul\"}";

User returnUser = objectMapper.readValue(json, User.class);

sample.json

{
  "name": [
    "dsg22",
    "dsg333"
  ],
  "age": 15,
  "cars": [
    {
      "name": "K5",
      "carNumber": "11rk 1111",
      "type": "sedan"
    },
    {
      "name": "Q5",
      "carNumber": "22rk 2222",
      "type": "SUV"
    }
  ]
}

User.java

@Data
@NoArgsConstructor
public class User {

    private String name;
    private int age;
    private List<Car> cars;


    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User(String name, int age, List<Car> cars) {
        this.name = name;
        this.age = age;
        this.cars = cars;
    }

}

Car.java

@JsonProperty로 카멜케이스 -> 스네이크기법으로 바꿈

@Data
public class Car {
    private String name;

    @JsonProperty("car_number")
    private String carNumber;

    @JsonProperty("TYPE")
    private String type;
}

main문

        System.out.println("main##########");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setAge(15);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11rk 1111");
        car1.setType("sedan");


        Car car2 = new Car();
        car2.setName("Q5");
        car2.setCarNumber("22rk 2222");
        car2.setType("SUV");

        List<Car> carList = Arrays.asList(car1, car2);
        user.setCars(carList);

        System.out.println(user);

        // 1) object -> json
        String json = objectMapper.writeValueAsString(user);

        System.out.println("json: " + json);

결과


JsonNode 구현방법

  • 접근방법
    JsonNode jsonNode = objectMapper.readTree(json);
    JsonNode cars = jsonNode.get("cars");
    ArrayNode arrayNode = (ArrayNode) cars;

  • Json 데이타 변경 방법
    ObjectNode objectNode = (ObjectNode) jsonNode;
    put()으로 변경
    objectNode.put("name", "steve");
    objectNode.put("age", 24);

  • Json 데이타 확인
    objectNode.toPrettyString()

main

// 2) JsonNode로 접근하기!
        JsonNode jsonNode = objectMapper.readTree(json);
        String _name = jsonNode.get("name").asText();
        int _age = jsonNode.get("age").asInt();

        System.out.println("name :" + _name);
        System.out.println("age :" + _age);

        JsonNode cars = jsonNode.get("cars");   // String으로 못받음!
        ArrayNode arrayNode = (ArrayNode) cars; // Array 타입으로 파싱

        List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {
        });     // List타입으로 convert
        System.out.println("_cars :" + _cars);

        // JsonNode를 쓰는 이유! 이렇게 변경이 가능!
        ObjectNode objectNode = (ObjectNode) jsonNode;
        objectNode.put("name", "steve");
        objectNode.put("age", 24);

        System.out.println("objectNode: " + objectNode.toPrettyString());

console

_cars :[Car(name=K5, carNumber=11rk 1111, type=sedan), Car(name=Q5, carNumber=22rk 2222, type=SUV)]
objectNode: {
  "name" : "steve",
  "age" : 24,
  "cars" : [ {
    "name" : "K5",
    "car_number" : "11rk 1111",
    "TYPE" : "sedan"
  }, {
    "name" : "Q5",
    "car_number" : "22rk 2222",
    "TYPE" : "SUV"
  } ]
}

따로 더 깊은 내용은 이 블로그를 참조하길 바란다.
https://pjh3749.tistory.com/m/281
https://velog.io/@zooneon/Java-ObjectMapper를-이용하여-JSON-파싱하기


Gson

Gson은 Google에서 개발한 자바 라이브러리로, JSON 데이터와 자바 객체 간의 직렬화 및 역질렬화를 처리하는 데 사용된다. Jackson의 ObjectMapper랑 같이 json 처리의 많이 사용되는 라이브러리이다.

다운로드

maven
https://mvnrepository.com/artifact/com.google.code.gson/gson/2.10.1

// https://mvnrepository.com/artifact/com.google.code.gson/gson
implementation group: 'com.google.code.gson', name: 'gson', version: '2.10.1'

객체 -> json

        // Person  -> json
        Gson gson = new Gson();
        Person p = new Person("홍길동", 20, "ms@naver.com");

        String gJson = gson.toJson(p);
        System.out.println(gJson);

json -> 객체

        // json -> Person
        Person p2 = gson.fromJson(gJson, Person.class);
        System.out.println(p2);

비교

성능: Jackson이 대용량 데이터 처리에서 더 나은 성능을 보입니다1.
기능성: Jackson은 다양한 데이터 형식을 지원하며, 더 많은 기능을 제공합니다1.
사용 편의성: Gson은 설정이 간단하고 사용이 쉬워, 간단한 JSON 작업에 적합합니다1.

결론

Jackson: 대용량 데이터 처리, 다양한 데이터 형식 지원, 고급 기능이 필요한 경우 추천.
Gson: 간단한 JSON 작업, 빠른 시작이 필요한 경우 추천.



참고

profile
배운 것을 기록합니다.

0개의 댓글