메멘토 패턴(Memento Pattern) 이해하기
메멘토 패턴은 객체의 상태를 캡슐화하여 특정 시점의 상태를 저장하고, 이후에 이를 복원할 수 있도록 하는 행동 디자인 패턴입니다. 이 패턴은 객체의 내부 상태를 외부에서 직접 접근하지 않고도 저장하고 복원할 수 있는 구조를 제공합니다.
메멘토 패턴은 특히 되돌리기(Undo) 기능이 필요한 애플리케이션에서 유용하며, 객체의 상태를 안전하게 관리하여 원래 상태로 복구할 수 있도록 합니다.
메멘토 패턴이란?
메멘토 패턴은 객체의 상태를 캡슐화하여 **저장(기록)**하고, 이후에 해당 상태를 **복원(롤백)**할 수 있도록 하는 패턴입니다. 이 패턴을 사용하면 클라이언트는 객체의 상태 저장과 복원 기능을 활용할 수 있지만, 객체의 내부 구조나 구현 세부 사항에 의존하지 않습니다.
주요 개념은 객체의 상태를 메멘토(Memento)라는 객체에 저장하고, 이를 관리하는 관리자를 통해 상태를 복원하는 것입니다.
메멘토 패턴의 구조
메멘토 패턴은 다음과 같은 구성 요소로 이루어집니다.
- Originator (원본 객체):
- 자신의 상태를 저장하거나 복원하는 객체입니다.
- SaveState() 메서드로 상태를 저장하고, RestoreState() 메서드로 상태를 복원합니다.
- Memento (메멘토):
- 저장된 상태를 나타내는 객체로, 원본 객체의 상태를 캡슐화하여 저장합니다.
- 메멘토 객체는 외부에서 상태를 변경할 수 없도록 설계됩니다.
- Caretaker (관리자):
- 메멘토 객체를 관리하며, 필요에 따라 저장된 상태를 원본 객체에 복원합니다.
- 메멘토 객체의 내용을 직접 변경하지 않습니다.
메멘토 패턴의 구현 방법
예제 코드: 텍스트 편집기 되돌리기 기능
텍스트 편집기에서 입력한 내용을 저장하고, 되돌리기(Undo) 기능을 구현하는 예제를 살펴보겠습니다.
// Memento 클래스
public class TextMemento
{
public string State { get; }
public TextMemento(string state)
{
State = state;
}
}
// Originator 클래스
public class TextEditor
{
private string _content;
public void SetContent(string content)
{
_content = content;
}
public string GetContent()
{
return _content;
}
public TextMemento SaveState()
{
return new TextMemento(_content);
}
public void RestoreState(TextMemento memento)
{
_content = memento.State;
}
}
// Caretaker 클래스
public class History
{
private Stack<TextMemento> _history = new Stack<TextMemento>();
public void Save(TextMemento memento)
{
_history.Push(memento);
}
public TextMemento Undo()
{
if (_history.Count > 0)
{
return _history.Pop();
}
return null;
}
}
// Client 코드
class Program
{
static void Main()
{
// Originator 생성
TextEditor editor = new TextEditor();
// Caretaker 생성
History history = new History();
// 상태 저장 및 변경
editor.SetContent("First version");
history.Save(editor.SaveState());
editor.SetContent("Second version");
history.Save(editor.SaveState());
editor.SetContent("Third version");
Console.WriteLine("Current Content: " + editor.GetContent());
// 상태 복원
editor.RestoreState(history.Undo());
Console.WriteLine("After Undo: " + editor.GetContent());
editor.RestoreState(history.Undo());
Console.WriteLine("After Undo: " + editor.GetContent());
}
}
실행 결과
Current Content: Third version
After Undo: Second version
After Undo: First version
코드 설명
- Memento:
- TextMemento 클래스는 텍스트 상태를 저장하는 객체로, 상태를 캡슐화하여 외부에서 직접 접근하지 못하도록 설계되었습니다.
- Originator:
- TextEditor 클래스는 텍스트 내용을 관리하며, SaveState()와 RestoreState() 메서드를 통해 상태를 저장하거나 복원할 수 있습니다.
- Caretaker:
- History 클래스는 메멘토 객체를 스택에 저장하여, 상태를 관리하고 필요할 때 상태를 복원할 수 있습니다.
- Client:
- 클라이언트는 TextEditor와 History를 사용하여 텍스트 내용을 변경하고, 저장된 상태를 복원합니다.
메멘토 패턴의 장단점
장점
- 객체 상태 관리:
- 객체의 내부 상태를 안전하게 저장하고 복원할 수 있습니다.
- 캡슐화 유지:
- 원본 객체의 상태를 외부에 노출하지 않고도 저장하고 복원할 수 있습니다.
- 되돌리기 기능 지원:
- Undo/Redo와 같은 기능을 구현하는 데 유용합니다.
단점
- 메모리 사용량 증가:
- 상태 저장 시 메멘토 객체를 생성하므로, 많은 상태를 저장할 경우 메모리 사용량이 증가할 수 있습니다.
- 복잡성 증가:
- 상태 저장과 복원 로직이 추가되므로 코드의 복잡도가 높아질 수 있습니다.
언제 메멘토 패턴을 사용해야 할까?
메멘토 패턴은 다음과 같은 상황에서 유용합니다.
- Undo/Redo 기능이 필요한 경우:
- 문서 편집기, 그래픽 디자인 도구 등에서 작업을 취소하거나 복원하는 기능이 필요한 경우.
- 객체 상태를 주기적으로 저장해야 하는 경우:
- 게임에서 캐릭터 상태를 저장하거나, 특정 시점에서 복구해야 하는 시스템에서 활용됩니다.
- 캡슐화를 유지하며 상태를 관리해야 할 경우:
- 원본 객체의 내부 상태를 외부에 노출하지 않고도 저장 및 복원이 필요한 경우.
메멘토 패턴과 관련 패턴 비교
메멘토 패턴은 객체의 상태 저장과 복원을 목적으로 하는 패턴으로, 다음과 같은 패턴과 차이가 있습니다.
- 커맨드 패턴:
- 작업 자체를 캡슐화하며, 작업을 실행하거나 취소(Undo)할 수 있도록 설계합니다. 메멘토 패턴은 상태를 저장하고 복원하는 데 중점을 둡니다.
- 상태 패턴:
- 객체의 상태를 별도의 상태 객체로 관리하여, 상태 전환과 동작을 캡슐화합니다. 메멘토 패턴은 상태 저장과 복원에 초점을 맞춥니다.
- 프로토타입 패턴:
- 객체를 복제하여 새로운 객체를 생성합니다. 메멘토 패턴은 객체의 상태를 저장하고, 특정 시점의 상태로 복원합니다.
실무에서 메멘토 패턴 활용하기
메멘토 패턴은 다음과 같은 실무 상황에서 유용하게 사용됩니다.
- 문서 편집기:
- 텍스트, 이미지, 서식 등을 포함한 작업 상태를 저장하고, 복원하는 Undo/Redo 기능 구현.
- 게임 상태 저장:
- 게임 진행 중 특정 시점의 캐릭터 상태(예: 체력, 위치, 아이템)를 저장하고, 복구할 수 있는 기능.
- 트랜잭션 관리:
- 데이터베이스 트랜잭션에서 작업 상태를 저장하고, 오류 발생 시 이전 상태로 롤백하는 기능.
- 시뮬레이션 소프트웨어:
- 특정 시점의 시뮬레이션 상태를 저장하고, 이후에 해당 상태로 되돌아가야 하는 시스템.
마무리하며
메멘토 패턴은 객체의 상태를 안전하게 저장하고 복원하는 데 매우 유용한 패턴입니다. 특히, 되돌리기 기능이 중요한 시스템에서 객체의 캡슐화를 유지하면서 상태를 관리할 수 있도록 도와줍니다.
객체 상태를 관리하거나 복원해야 하는 시스템에서 메멘토 패턴을 활용해보세요. 이를 통해 유연하고 안전한 상태 관리 로직을 구현할 수 있습니다.
'Thinking > Concept' 카테고리의 다른 글
상태 패턴(State Pattern) 이해하기 (0) | 2024.11.17 |
---|---|
옵저버 패턴(Observer Pattern) 이해하기 (0) | 2024.11.17 |
미디에이터 패턴(Mediator Pattern) 이해하기 (0) | 2024.11.16 |
이터레이터 패턴(Iterator Pattern) 이해하기 (0) | 2024.11.16 |
인터프리터 패턴(Interpreter Pattern) 이해하기 (0) | 2024.11.16 |