transient 키워드는 Java에서 클래스의 필드를 직렬화 과정에서 제외해야 하는 필드로 표시하는 데 사용됩니다. 즉, 이러한 필드는 객체를 바이트 스트림으로 저장할 때 저장되지 않습니다.
이는 다음과 같은 경우에 유용합니다:
사용 예:
import java.io.*; class User implements Serializable { private String username; private transient String password; // 직렬화되지 않음 public User(String username, String password) { this.username = username; this.password = password; } }
비직렬화 후에 password 필드는 null 값을 갖게 됩니다.
transient 필드가 자체적으로 Serializable을 구현하는 객체에 대한 참조인 경우 무엇이 발생합니까?
답변: 필드는 여전히 직렬화되지 않으며, 이는 필드에 적용되고 객체의 유형에 적용되지 않습니다. 객체가 Serializable을 구현하더라도, 필드가 transient로 표시되면 해당 객체의 직렬화에서 제외됩니다.
예:
class Credentials implements Serializable { String password; } class Account implements Serializable { transient Credentials credentials; }
credentials 필드는 항상 직렬화 후 null이 되며, Credentials 자체가 직렬화 가능하더라도 그렇습니다.
이야기
인터넷 뱅킹에서 사용자 "세션" 객체 설계 시, 인증 세션 필드를 transient로 선언하는 것을 잊어버려, 직렬화된 객체가 민감한 정보와 함께 파일에 기록되었습니다. 이로 인해 개인 정보 유출이 발생했습니다.
이야기
브로커 서비스에서 일부 캐시 필드가 기본적으로 직렬화되었습니다. 직렬화된 상태에서 복원한 후, 애플리케이션은 캐시에서 오래된 데이터를 사용하기 시작하여 실제 계좌에서 표시된 총액과 불일치가 발생했습니다.
이야기
개발자는 transient 필드가 비직렬화 후 자동으로 채워질 것이라고 가정하고 custom readObject/writeObject 구조를 구현하지 않았습니다. 결국 필드는 null 상태로 남아 프로그램이 해당 필드를 처음 접근할 때 비정상적으로 종료되었습니다.