본문 바로가기

Java

(Java) - Gson으로 Json 다루기

반응형

🍳머리말

Gson은 무엇인지 간단히 알아보고 간단한 예제 code를 살펴보는 글입니다.


📕 Gson

Google에서 만든 open source java library입니다.

https://github.com/google/gson

 

GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

A Java serialization/deserialization library to convert Java Objects into JSON and back - GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

github.com

📔 배경

Java에서 http 혹은 https로 Rest API를 작성시 객체를 GET, POST등의 형태로 자주 전송합니다. 전송시 사용되는 상태 전달은 json 형식입니다. 전송은 되었으나 이를 각자의 언어로 이루어진 server와 client의 경우 어떻게 처리해야 할까요? json을 request 또는 response로 받아 project내 code의 객체에 mapping해야 합니다. 예시를 보시죠 

 

 📑 DTO 정의

먼저 App을 생성, 삭제, 갱신, 조회를 수행할 때 주고 받을 객체가 다음처럼 지정이 되었다고 가정해봅니다. DTO는 주로 이런식으로 memeber 변수와 getter, setter로 이뤄져 있습니다. 이 DTO를 client와 server 개발자가 각각 이 형태로 정하자고 합의를 보고 각자 구현한 내용은 다음과 같다고 가정합니다.

  📑 server 내 정의 된 DTO

package com.model.dto.app;

public class AppDTO {
  private Integer id;
  private Integer userId;
  private String appName;
  private String timeStamp;

  public AppDTO() {
    super();
  }

  public AppDTO(Integer id, Integer userId, String appName, String timeStamp) {
    super();
    this.id = id;
    this.appName = appName;
    this.userId = userId;
    this.timeStamp = timeStamp;
  }

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

  public Integer getId() {
    return id;
  }

  public void setAppName(String appName) {
    this.appName = appName;
  }

  public String getAppName() {
    return appName;
  }

  public Integer getUserId() {
    return this.userId;
  }

  public void setUserId(Integer userId) {
    this.userId = userId;
  }

  public String getTimeStamp() {
    return this.timeStamp;
  }

  public void setTimeStamp(String timeStamp) {
    this.timeStamp = timeStamp;
  }
}

  📑 client  내 정의된 DTO

export interface IApp {
    id: number;
    appName: string;
    userId: number;
    timeStamp: string;
}

 

이제 client에서 사용자와 상호작용시 db접근을 server를 통해서 하므로 필요한 input data를 json형식으로 정의하게 되면 다음과 같은 data가 전송되게 됩니다.

"body": {
    "AppDTO": {
      "id": 1,
      "appName": "test1",
      "userId": 1246789142,
      "timestamp": "2023-02-21 15:47:59.280"
    }
  }

이 DTO에서 json으로의 변환을 gson으로 하게되면 직렬화, 반대로 json에서 DTO로 변환하게 되면 역직렬화가 됩니다.


📕예제

📔 DTO안에 DTO가 있는 구조의 직,역직 렬화

  📑 class 정의

class OuterDTO {
  private String outerDtoProperty;
  private InnerDTO innerDto;

  public OuterDTO(String outerDtoProperty, InnerDTO innerDto) {
    this.outerDtoProperty = outerDtoProperty;
    this.innerDto = innerDto;
  }

  // getter, setter, toString 등의 method 생략

}

class InnerDTO {
  private String innerDtoProperty;

  public InnerDTO(String innerDtoProperty) {
    this.innerDtoProperty = innerDtoProperty;
  }

  // getter, setter, toString 등의 method 생략

}

 

OuterDTO 생성자가 호출될 시 instance화 과정에서 InnerDTO가 생성되도록 구성된 class 선언부입니다.

 

📑 직렬화, 역직렬화

import com.google.gson.Gson;

public class Main {

  public static void main(String[] args) {
    // DTO 안에 DTO가 있는 Java 클래스 객체 생성
    InnerDTO innerDto = new InnerDTO("innerDtoProperty");
    OuterDTO outerDto = new OuterDTO("outerDtoProperty", innerDto);

    // Gson을 사용하여 직렬화
    Gson gson = new Gson();
    String json = gson.toJson(outerDto);

    // 직렬화된 JSON 출력
    System.out.println(json);

    // Gson을 사용하여 역직렬화
    OuterDTO deserializedDto = gson.fromJson(json, OuterDTO.class);

    // 역직렬화된 DTO 출력
    System.out.println(deserializedDto);
  }
}

 이렇게 최상단 DTO의 class정보를 읽어 toJson함수 사용시 직렬화가 가능합니다. 반대로 fromJson함수의 두 번째 인자로 전달해주면 역직렬화가 가능합니다. 직렬화시 DTO class의 member 변수가 json의 key명으로 사용됩니다.


📕참조

https://github.com/google/gson

 

GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

A Java serialization/deserialization library to convert Java Objects into JSON and back - GitHub - google/gson: A Java serialization/deserialization library to convert Java Objects into JSON and back

github.com


*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.