JAVA

[JAVA] Gson의 필드 컨트롤

인생아 2024. 12. 14. 15:15
반응형

Gson은 JSON 직렬화 및 역직렬화에서 유연한 필드 제어를 제공합니다. @Expose, @SerializedName, 리플렉션 등의 기능을 활용하여 개발 중 발생할 수 있는 다양한 요구사항을 손쉽게 해결할 수 있습니다.

특정 필드 제외하기 (@Expose, excludeFieldsWithoutExposeAnnotation)

Gson은 기본적으로 모든 필드를 JSON에 포함합니다. 하지만 필요에 따라 특정 필드를 제외할 수 있습니다. 이를 위해 @Expose 애너테이션과 excludeFieldsWithoutExposeAnnotation 옵션을 사용할 수 있습니다.

@Expose를 활용한 특정 필드 제외

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        User user = new User("박민수", 30, "비밀정보");

        // Gson 객체 생성
        Gson gson = new GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()
                .setPrettyPrinting()
                .create();

        // 직렬화
        String json = gson.toJson(user);
        System.out.println("직렬화된 JSON:");
        System.out.println(json);
    }
}

class User {
    @Expose
    String name;

    @Expose
    int age;

    String sensitiveData; // 제외됨

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

출력 결과:

직렬화된 JSON:
{
  "name": "박민수",
  "age": 30
}

위 예제에서는 sensitiveData 필드가 @Expose 애너테이션이 없으므로 직렬화에서 제외되었습니다.

반응형

JSON 필드 이름 커스터마이징 (@SerializedName)

JSON 필드 이름을 클래스 필드와 다르게 정의해야 할 때 @SerializedName 애너테이션을 사용할 수 있습니다. 이를 통해 JSON 필드 이름과 클래스 필드 이름을 매핑할 수 있습니다.

@SerializedName을 활용한 필드 이름 매핑

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Person person = new Person("김영희", "서울특별시", "개발팀");

        // Gson 객체
        Gson gson = new GsonBuilder().setPrettyPrinting().create();

        // 직렬화
        String json = gson.toJson(person);
        System.out.println("직렬화된 JSON:");
        System.out.println(json);

        // 역직렬화
        String inputJson = "{\"full_name\":\"김영희\",\"city\":\"서울특별시\",\"department\":\"개발팀\"}";
        Person deserializedPerson = gson.fromJson(inputJson, Person.class);
        System.out.println("\n역직렬화된 객체:");
        System.out.println("이름: " + deserializedPerson.fullName);
        System.out.println("도시: " + deserializedPerson.city);
        System.out.println("부서: " + deserializedPerson.department);
    }
}

class Person {
    @SerializedName("full_name")
    String fullName;

    @SerializedName("city")
    String city;

    @SerializedName("department")
    String department;

    public Person(String fullName, String city, String department) {
        this.fullName = fullName;
        this.city = city;
        this.department = department;
    }
}

출력 결과:

직렬화된 JSON:
{
  "full_name": "김영희",
  "city": "서울특별시",
  "department": "개발팀"
}

역직렬화된 객체:
이름: 김영희
도시: 서울특별시
부서: 개발팀

@SerializedName은 필드 이름이 복잡한 API와 상호작용할 때 매우 유용합니다.

접근 제한 필드 처리

Gson은 기본적으로 public 필드만 처리합니다. 하지만 private 필드도 포함하려면 리플렉션을 사용하거나 Gson의 전략을 변경할 수 있습니다.

리플렉션을 활용한 private 필드 처리

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Employee employee = new Employee("이철수", "인천광역시", "마케팅팀");

        // Gson 객체
        Gson gson = new GsonBuilder()
                .excludeFieldsWithoutExposeAnnotation()
                .setPrettyPrinting()
                .create();

        // 직렬화
        String json = gson.toJson(employee);
        System.out.println("직렬화된 JSON:");
        System.out.println(json);
    }
}

class Employee {
    @Expose
    private String name;

    @Expose
    private String address;

    @Expose
    private String department;

    public Employee(String name, String address, String department) {
        this.name = name;
        this.address = address;
        this.department = department;
    }
}

출력 결과:

직렬화된 JSON:
{
  "name": "이철수",
  "address": "인천광역시",
  "department": "마케팅팀"
}

위 예제에서는 private 필드@Expose 애너테이션을 활용하여 JSON에 포함되었습니다.

Gson 필드 컨트롤의 활용 사례

  • 특정 필드 제외는 보안이 중요한 데이터(예: 비밀번호, 토큰 등)를 처리할 때 유용합니다.
  • JSON 필드 이름 커스터마이징은 외부 API와 JSON 형식을 맞출 때 효율적입니다.
  • 접근 제한 필드 처리는 엔티티 클래스의 캡슐화를 유지하면서도 JSON 데이터를 직렬화할 때 활용됩니다.

참고사이트

Gson 공식 문서: https://github.com/google/gson

반응형