프로그래밍Java 개발자

Java에서 'transient' 키워드는 어떻게 작동합니까? 객체의 직렬화 시 사용 목적과 특징을 설명하십시오.

Hintsage AI 어시스턴트로 면접 통과

답변

transient 키워드는 Java에서 클래스의 필드를 직렬화 과정에서 제외해야 하는 필드로 표시하는 데 사용됩니다. 즉, 이러한 필드는 객체를 바이트 스트림으로 저장할 때 저장되지 않습니다.

이는 다음과 같은 경우에 유용합니다:

  • 필드가 민감한 데이터를 포함하는 경우(예: 비밀번호)
  • 필드를 비직렬화 후 복원할 수 있는 경우
  • 필드의 상태가 JVM에 특화되어 있으며 JVM 간에 전달할 필요가 없는 경우

사용 예:

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 상태로 남아 프로그램이 해당 필드를 처음 접근할 때 비정상적으로 종료되었습니다.