티스토리 뷰

공부/JAVA

Java transient 키워드

불끈 2025. 4. 14. 18:29

오랫동안 자바를 사용해왔으면서도 생소한 키워드 하나를 오늘 알아봅니다.

 

 

transient : 일시적인, 순간적인, 단기 체류자

 

 

Java에서 직렬화(serialization) 과정 중, 특정 필드를 제외시키기 위해 사용하는 키워드입니다. Java 1.0 버전(1996년)부터 존재해온 매우 오래된 기능이라고 합니다. 직렬화(Serialization)는 객체(Object)를 바이트 스트림(byte stream)이나 다른 전송 가능한 형태로 변환하는 과정입니다. 반대로, 역직렬화(Deserialization)는 저장/전송된 데이터를 다시 원본 객체로 복원하는 과정입니다.

 

transient 키워드가 사용된 필드는 이 직렬화 과정에서 제외하게 됩니다. 보안상 민감한 데이터 (비밀번호 같은)나 직렬화할 필요가 없는 것들에 사용하게 된다고 하네요. 데이터베이스에서 읽어온 민감한 데이터를 아무런 대책없이 전송이나 저장해버리면 안 될테니. 그러한 경우에 사용합니다.

 

 

초기 직렬화 설계: Java의 직렬화 시스템이 처음 설계될 때 포함됨

  • java.io.Serializable 인터페이스(마커 인터페이스)와 함께 도입
  • JDK 1.1(1997년)에서 공식적으로 문서화됨

 

등장 이유:

  • 객체 직렬화 시 일부 필드를 제외해야 할 필요성 대두
  • 보안 상 민감한 데이터(패스워드 등)나 임시 계산 값 등을 저장하지 않기 위해
  • 직렬화 불가능한 객체 참조를 가진 필드 처리 필요

JAVA 버전 별 현황

  • Java 1.0: 최초 도입 (직렬화 기본 메커니즘의 일부)
  • Java 1.1: 공식 문서화 및 직렬화 스펙 정립
  • Java 1.2+: transient 필드의 동작 방식이 표준화됨
  • 최신 버전: Java 17에서도 동일한 의미로 유지 (호환성을 깨지 않음)

 

import java.io.*;

public class User implements Serializable {
    private String username;
    private transient String password;  // 직렬화에서 제외될 필드
    private transient int sessionId;    // 직렬화에서 제외될 필드
    
    // 생성자, getter, setter 등...
    
    public static void main(String[] args) {
        User user = new User("john", "secret123", 12345);
        
        // 직렬화
        try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("user.dat"))) {
            out.writeObject(user);
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 역직렬화 시 password와 sessionId는 기본값(null, 0)으로 설정됨
    }
}

 

 

 

transient 필드는 역직렬화 시 기본값으로 초기화됩니다.

  • 객체 타입: null
  • 숫자 타입: 0 (또는 0.0)
  • boolean: false

 

 

 

transient와 JSON 직렬화의 관계

 

transient 키워드가 JSON 직렬화에 영향을 미치는지 여부는 사용하는 라이브러리에 따라 다릅니다. 기본적으로 transient는 Java의 기본 직렬화(Serialization)만을 위한 키워드이지만, 일부 JSON 라이브러리에서도 이 키워드를 고려합니다.

  • Jackson: 기본적으로 transient 필드 제외 (권장되는 방식)
  • Gson: 기본적으로 포함 (별도 설정 필요)

JSON 직렬화에서 필드를 제외하려면 라이브러리별 어노테이션(@JsonIgnore, @Expose 등)을 사용하는 것이 더 명확하고 이식성이 좋습니다.