메멘토 패턴은 객체의 내부 상태를 캡처하여 외부에 저장하고, 필요시 해당 상태로 복원할 수 있는 행동 디자인 패턴입니다.
핵심 개념
목적: 객체의 캡슐화를 유지하면서 내부 상태를 저장하고 이후에 복원할 수 있도록 합니다.
주요 기능: 객체의 상태를 별도의 메멘토 객체에 저장하여, 나중에 이전 상태로 되돌릴 수 있는 기능을 제공합니다.
적용 시기: 사용자 작업 취소 기능, 상태 기록 및 복구, 에러 발생 시 롤백 등이 필요할 때 사용합니다.
구현 방법: 상태 저장을 전담하는 메멘토 클래스를 생성하여 관리합니다.
장점:
- 사용자에게 상태 복구 메커니즘 제공
- 상태 저장 세부사항을 캡슐화
단점:
- 리소스 소모가 큼 (많은 멤버 변수일 경우 메모리 사용량 증가)
- 빈번한 상태 저장 시 성능 저하 가능성
실제 적용 예시
- 문서 편집기의 실행 취소(Undo) 기능
- 게임 진행 상태 저장
- 데이터베이스 트랜잭션 관리
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());
}
}