Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Gson 직렬화 시 특정 필드 제외하는 방법 – transient 키워드 활용법

Gson 라이브러리는 transient 한정자(modifier)를 사용하여 직렬화 과정에서 특정 필드를 손쉽게 제외할 수 있는 간편한 방법을 제공합니다. Java 클래스의 필드에 transient를 선언하면 Gson은 직렬화(serialization)역직렬화(deserialization) 두 과정 모두에서 해당 필드를 무시(ignore)합니다.

transient 키워드란?

transient는 Java에서 기본으로 제공하는 키워드로, 해당 필드가 영속적인 데이터가 아니며 저장이나 전송 대상에서 제외되어야 함을 의미합니다. 이 키워드는 자바 기본 직렬화(Serializable)뿐만 아니라 Gson과 같은 JSON 라이브러리에서도 동일하게 적용됩니다.

예제 코드

import com.google.gson.*;

public class GsonTransientFieldTest {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        Person p = new Person("Raja", "Ramesh", 28, 35000.00);
        String jsonStr = gson.toJson(p);
        System.out.println(jsonStr);
    }
}

// Person 클래스
class Person {
    private String firstName;
    private transient String lastName;
    private int age;
    private transient double salary;

    public Person(String firstName, String lastName, int age, double salary) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
        this.salary = salary;
    }
}

실행 결과

{
  "firstName": "Raja",
  "age": 28
}

실행 결과에서 확인할 수 있듯이, lastNamesalary 필드는 transient로 선언되었기 때문에 생성된 JSON 문자열에서 완전히 제외됩니다. 반면 일반 필드인 firstNameage는 정상적으로 직렬화됩니다.

@Expose 어노테이션으로 더 세밀하게 제어하기

transient 외에도 Gson은 @Expose 어노테이션을 통해 더욱 유연한 제어 방식을 지원합니다. GsonBuilder에서 excludeFieldsWithoutExposeAnnotation() 메서드를 호출하면, @Expose가 명시된 필드만 직렬화·역직렬화 대상에 포함됩니다.

import com.google.gson.annotations.Expose;

class Person {
    @Expose
    private String firstName;              // 직렬화·역직렬화 모두 포함

    @Expose(serialize = false)
    private String lastName;               // 역직렬화에만 포함

    private int age;                       // @Expose 없음 → 완전히 제외
}

// Gson 인스턴스 생성
Gson gson = new GsonBuilder()
        .excludeFieldsWithoutExposeAnnotation()
        .setPrettyPrinting()
        .create();

이처럼 민감한 정보(비밀번호, 급여 등)를 JSON 응답에서 숨기고 싶을 때 transient 또는 @Expose를 상황에 맞게 활용하면 됩니다. 필드 단위로 간단히 제외하려면 transient를, 포함 여부를 개별적으로 세밀하게 관리하고 싶다면 @Expose를 사용하는 것이 좋습니다.