메멘토 패턴
메멘토 패턴(Memento Pattern)은 객체의 내부 상태를 캡슐화하여 저장하고, 필요할 때 그 상태를 복원할 수 있게 한다. 상태 변화가 일어날 때마다 그 상태를 메멘토 객체로 저장하여 보관하고, 필요할 경우 복원할 수 있다. 주로 데이터의 손실 방지, 취소, 복구에 사용되기 때문에 적용 시나리오의 범위가 명확하고 제한적이다. 백업 전략을 선택하는 것은 시스템의 요구 사항에 따라 달라지며, 메멘토 패턴에서는 필요에 따라 상태를 저장하는 방식을 조정할 수 있다.
다만, 객체 상태를 계속해서 저장하고 관리해야 하므로 메모리나 저장 공간의 사용에 신경을 써야 할 필요가 있다. 이 문제를 해결하기 위해 주로 전체 백업full backup과 증분 백업incremental backup이 사용된다. 전체 백업은 데이터의 모든 상태를 그대로 저장하는 방식으로, 백업을 수행할 때 시스템이나 객체의 전체 데이터를 한 번에 저장한다. 이 방법은 복원 시 전체 데이터를 그대로 복원할 수 있어 간편하지만, 저장 공간을 많이 차지하고, 백업 시간이 길어질 수 있다.
반면, 증분 백업은 이전 백업 이후에 변경된 부분만 저장하는 방식으로, 전체 데이터를 다시 저장하는 것이 아니라 변화된 데이터만 기록하여 저장 공간과 시간을 절약할 수 있다. 복원 시에는 마지막 전체 백업과 변경된 부분을 결합하여 데이터를 복원한다. 증분 백업은 효율적이지만 복원 과정이 복잡할 수 있다.
메멘토 패턴은 크게 세 부분으로 나뉠 수 있다. 상태를 캡슐화하는 Memento 객체, 이를 저장하고 관리하는 Caretaker 객체, 그리고 상태를 가지고 있으면서 필요할 때마다 메멘토를 생성 및 복원하는 Originator 객체가 그것이다.
// Memento 클래스: 객체의 상태를 저장하는 역할 class TextMemento { private text: string; constructor(text: string) { this.text = text; } public getText(): string { return this.text; } } // Originator 클래스: 상태를 변경하고 메멘토를 생성 및 복원하는 역할 class TextEditor { private text: string = ''; public setText(text: string): void { this.text = text; } public getText(): string { return this.text; } // 메멘토 객체를 생성하여 상태를 저장 public save(): TextMemento { return new TextMemento(this.text); } // 메멘토 객체로부터 상태를 복원 public restore(memento: TextMemento): void { this.text = memento.getText(); } } // Caretaker 클래스: 메멘토 객체를 보관하고 관리 class Caretaker { private memento: TextMemento | null = null; public saveMemento(memento: TextMemento): void { this.memento = memento; } public getMemento(): TextMemento | null { return this.memento; } } function mementoPatternExample(): void { // 객체 생성 const editor = new TextEditor(); const caretaker = new Caretaker(); // 텍스트 수정 및 상태 저장 editor.setText("Hello, world!"); console.log("Text Editor:", editor.getText()); caretaker.saveMemento(editor.save()); // 텍스트 수정 editor.setText("Hello, Memento Pattern!"); console.log("Text Editor:", editor.getText()); // 상태 복원 editor.restore(caretaker.getMemento() as TextMemento); console.log("Restored Text Editor:", editor.getText()); }
블로그의 정보
Ayden's journal
Beard Weard Ayden