Ayden's journal

메멘토 패턴

메멘토 패턴(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

활동하기