객체 상태 저장 및 복구를 위한 메멘토 패턴 구현

메멘토 패턴은 객체의 내부 상태를 캡처하여 외부에 저장하고, 필요시 해당 상태로 복원할 수 있는 행동 디자인 패턴입니다.

핵심 개념

목적: 객체의 캡슐화를 유지하면서 내부 상태를 저장하고 이후에 복원할 수 있도록 합니다.

주요 기능: 객체의 상태를 별도의 메멘토 객체에 저장하여, 나중에 이전 상태로 되돌릴 수 있는 기능을 제공합니다.

적용 시기: 사용자 작업 취소 기능, 상태 기록 및 복구, 에러 발생 시 롤백 등이 필요할 때 사용합니다.

구현 방법: 상태 저장을 전담하는 메멘토 클래스를 생성하여 관리합니다.

장점:

  1. 사용자에게 상태 복구 메커니즘 제공
  2. 상태 저장 세부사항을 캡슐화

단점:

  1. 리소스 소모가 큼 (많은 멤버 변수일 경우 메모리 사용량 증가)
  2. 빈번한 상태 저장 시 성능 저하 가능성

실제 적용 예시

  1. 문서 편집기의 실행 취소(Undo) 기능
  2. 게임 진행 상태 저장
  3. 데이터베이스 트랜잭션 관리

Java 구현 예제

메멘토 패턴은 주로 Originator, Memento, Caretaker 세 클래스로 구현됩니다.

1. 상태 저장 클래스

StateSnapshot.java

public class StateSnapshot {
    private final String savedState;
    
    public StateSnapshot(String state) {
        this.savedState = state;
    }
    
    public String getSavedState() {
        return savedState;
    }
}

2. 상태 관리 클래스

DocumentEditor.java

public class DocumentEditor {
    private String currentContent;
    
    public void setContent(String content) {
        this.currentContent = content;
    }
    
    public String getContent() {
        return currentContent;
    }
    
    public StateSnapshot createSnapshot() {
        return new StateSnapshot(currentContent);
    }
    
    public void restoreFromSnapshot(StateSnapshot snapshot) {
        currentContent = snapshot.getSavedState();
    }
}

3. 스냅샷 관리자

HistoryManager.java

import java.util.Stack;

public class HistoryManager {
    private Stack<StateSnapshot> history = new Stack<>();
    
    public void saveSnapshot(StateSnapshot snapshot) {
        history.push(snapshot);
    }
    
    public StateSnapshot getLastSnapshot() {
        return history.pop();
    }
}

4. 클라이언트 사용 예제

ClientApplication.java

public class ClientApplication {
    public static void main(String[] args) {
        DocumentEditor editor = new DocumentEditor();
        HistoryManager history = new HistoryManager();
        
        editor.setContent("첫 번째 내용");
        history.saveSnapshot(editor.createSnapshot());
        
        editor.setContent("수정된 내용");
        history.saveSnapshot(editor.createSnapshot());
        
        editor.setContent("최종 내용");
        
        // 상태 복원
        editor.restoreFromSnapshot(history.getLastSnapshot());
        System.out.println("복원된 내용: " + editor.getContent());
    }
}

태그: 디자인패턴 메멘토패턴 객체지향 상태관리 java

8월 7일 17:21에 게시됨