본문 바로가기
Design Pattern

18. 메멘토 패턴 (memento pattern)

by 킹차니 2021. 12. 28.

 

메멘토 패턴

캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법

--> 객체 상태를 외부에 저장했다가 해당 상태로 다시 복귀할 수 있다.

originator : 우리가 저장할 객체이다. 즉 originator의 state를 저장할 것이다.

care taker : originator의 내부 정보를 careTaker가 가져와서 저장한다.

memento : 내부정보를 추상화한 클래스. careTaker는 originator의 디테일한 정보를 직접적으로 가지는 것이 아니라 memento타입으로 가진다. memento는 imuutable한 객체이어야 한다.


 

코드로 알아보기

만약 게임을 하는데, 게임을 중지시켰다가 다시 실행해도 중지 전까지의 스코어는 유지되어야 한다. 아주 간단하게 코드로 보면 아래와 같다.

 

Game

 

Client

초반에 red팀의 score는 10, blue팀의 score는 20이다. 이러한 정보를 각각 redTeamScore, blueTemScore에 저장하두고 

아래에서 새로 생성된 Game객체의 score정보에 set해준다.

 

❗️문제점❗️

하지만 위의 Client를 보면 Client가 일일히 Game의 score에 대해 알고 있어야 한다. 이를 메멘토 패턴을 적용하여 해결해보자.

 

먼저 Memento인 GameSave를 보자.

Memento는 GameSave가 가지고 있는 필드를 모두 가지고 있고, 불변 객체이다. 즉 score정보들은 한번 생성자를 통해 한번 생성되면 절대 변하지 않는다.

 

Originator인 Game은 이전과 같지만, Game의 상태를 GameSave에 저장하는 save메소드와 GameSave로 부터 이전의 상태를 되돌리는 restore메소드가 추가된다.

 

 

Client는 아래와 같다. 이제 직접적으로 Game의 score에 대한 정보를 알 필요 없이 GameSave(Memento)에 요청한다.

 

 


장점과 단점

 

장점

1. 캡슐화를 지키면서 상태 객체의 상태 스냅샷을 만들 수 있다.

2. 객체 상태를 저장하고 또는 복원하는 역할을 Care Taker에게 위임할 수 있다.

3. 객체 상태가 바뀌어도 클라이언트 코드는 바뀌지 않는다.

 

단점

많은 정보를 저장하는 Mementor를 자주 생성하는 경우 메모리 사용량에 많은 영향을 줄 수 있다.

 


실제로 어디에 사용되나?

 

자바는 직렬화를 제공한다. 자바의 직렬화를 통해 Originate의 상태를 파일에 저장한 후, 파일에 저장된 state정보를 역직렬화하여 restore할 수 있다.

 

 

출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4