본문 바로가기

Design/Design Pattern

[Design Pattern] Memento Pattern

이번 장에서는 메멘토(Memento) 패턴에 대해서 알아본다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


메멘토 패턴이란?
위키백과에 따른 정의는 아래와 같다.

객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 디자인 패턴이다.(롤백을 통한 실행 취소)
메멘토 패턴은 3개의 객체로 구현된다. 오리지네이터(originator), 케어테이커(caretaker), 메멘토(memento).
오리지네이터는 내부 상태를 보유하고 있는 일부 객체이다. 케어테이커는 오리지네이터에 대해 무언가를 하지만 변경에 대한 실행 취소를 하기를 원한다.
케어테이커는 먼저 오리지네이터에게 메멘토 객체를 요청한다. 그 뒤 예정된 일련의 명령을 수행한다.
명령 이전의 상태로 되돌리기 위해 메멘토 객체를 오리지네이터에 반환한다.

위키백과 답지 않게 상당히 길게 서술되어 있다.
쉽게 풀어보면 객체의 상태를 저장하고 언제든지 되돌릴 수 있는 디자인 패턴이라는 점만 기억하면된다.

이번에는 휴대폰의 사진첩과 클라우드에 저장되어 있는 사진첩간의 동기화를 예시로 진행해보겠다.
정확한 예시는 아이폰의 사진첩과 아이클라우드다. 안드로이드를 사용하는 사용자들은 갤러리와 구글클라우드로 이해하면 될 듯하다.


GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

Originator: 상태를 기억해야할 객체.
Memento: Originator을 상태 값을 가지고 있으며 Originatord의 상태를 변경한다.
CareTaker: Memento를 저장한다.

위의 이미지를 아이 클라우드와 아이폰의 갤러리(사진첩)에 적용시키면 아래와 같은 Class Diagram이 그려진다.

Gallery가 있고 사용자들은 원할 때 GallerySnapshot을 생성하여 언제든지 iCloud에 저장할 수 있다.
휴대폰이 고장나서 갤러리가 사라지거나 이전 상태로 돌리고 싶을 때 언제든 iCloud에 저장된 스냅샷의 상태로 돌릴 수 있다.


코드를 보면서 하나씩 살펴보도록 한다.

Photo Class
사진첩(Gallery)에 저장된 사진 클래스.

Gallery Class
메멘토 패턴의 Originator
Photo를 저장하는 기능을 하는 클래스.
고장나서 사진첩이 지워지는 상황을 만들기 위한 broken 메서드가 있지만 해당 메서드는 메멘토 패턴과 무관하므로 무시해도 좋다.
메멘토 역할을 하는 GallerySnapshot 클래스를 통해서 이전 상태로 돌아가는 rollbackGallery 메서드를 구현하고 있다.

GallerySnapshot Class
메멘토 패턴의 Memento
Gallery 클래스와 동일하게 사진들을 보유하고 있으며 자신이 생성된 일자를 가지고 있다.

ICloud Class
메멘토 패턴의 CareTaker
Snapshot을 업로드 다운로드 하는 메서드를 구현하고 있으며 자신이 보유한 Snapshot을 출력하는 역할을 한다.

User Class
아이폰과 아이클라우드를 사용하는 사용자 클래스.
메멘토 패턴 특성상 스토리가 필요하여 코드가 길어졌지만 어려운 부분이 없으므로 이해하기 힘든 부분은 없을 것이다.

코드를 실행시킨 결과는 아래와 같다.


지금까지 아이폰과 아이클라우드에 메멘토 패턴을 적용해서 알아보았다.

'Design > Design Pattern' 카테고리의 다른 글

[Design Pattern] Iterator Pattern  (0) 2022.02.04
[Design Pattern] Flyweight Pattern  (0) 2022.02.04
[Design Pattern] State Pattern  (0) 2022.02.03
[Design Pattern] Mediator Pattern  (0) 2022.02.02
[Design Pattern] Observer Pattern  (0) 2022.02.02