PersistenceDelegate

PersistenceDelegate (영속성 델리게이트)

주어진 클래스의 인스턴스 상태를 해당 클래스의 공개 API 메서드 관점에서 표현하는 책임을 지는 추상 클래스예요. 영속성 책임을 클래스 자체에 두는 대신(예: ObjectOutputStreamreadObject/writeObject), XMLEncoder처럼 위임 모델을 쓰는 스트림은 클래스와 무관하게 동작을 제어할 수 있어요.

출처: Java API Reference

본문

보통 클래스 안에 이런 정보를 두는 것이 가장 좋지만, 때로는 단일 클래스의 사소한 문제가 전체 객체 그래프 기록을 막는 경우가 있어요. 이때 애플리케이션 개발자는 문제가 있는 클래스를 로컬로 가리거나 대체 영속 기법을 써야 하죠. 위임 모델은 애플리케이션이 아닌 클래스의 구현을 수정하지 않고도 직렬화 과정의 모든 부분에 개입할 수 있는 비교적 깨끗한 메커니즘을 제공해요.

이 영속 기법은 writeObject의 유사물에 대응하는 readObject가 필요 없다는 점에서 전통적 직렬화와 달라요. writeObject 유사물은 각 인스턴스를 공개 API로 인코딩하고, 직렬화 형식을 읽는 절차는 Java 언어 명세의 메서드 호출 의미론에 의해 정의되므로 readObject 유사물을 정의할 필요가 없어요. writeObjectreadObject 구현 간의 의존성을 깨는 것이 이 기법으로 만든 아카이브가 참조 클래스의 비공개 구현 변경에 영향받지 않게 하는 핵심이에요.

영속성 델리게이트는 객체 영속성의 모든 측면을 제어할 수 있어요.

  • 인스턴스가 같은 클래스의 다른 인스턴스로 변경될 수 있는지 결정하기
  • 공개 생성자나 공개 팩토리 메서드를 호출해 객체 인스턴스화하기
  • 객체 초기화 수행하기

주요 메서드는 다음과 같아요.

protected PersistenceDelegate()

public void writeObject(Object oldInstance, Encoder out)
protected boolean mutatesTo(Object oldInstance, Object newInstance)
protected abstract Expression instantiate(Object oldInstance, Encoder out)
protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out)

구체적 구현 클래스로 DefaultPersistenceDelegate가 있어요. 관련 API는 XMLEncoder예요.

더 알아보기 (Learn more)

Java 공식 API