메멘토 패턴으로 객체 상태 저장과 복원 구현하기
메멘토 패턴이 뭘까??
메멘토 패턴은 어떠한 class 의 상태를 계속해서 저장하고 원할때는 이전의 상태로 돌아 갈 수 있도록 하는 패턴을 말한다! 마치… 영화 메멘토에서 자신의 몸에 문신을 새겨 기억을 유지하는거 처럼 메멘토 패턴은 특정 class 에 자신의 예전 state 를 새겨 저장하고 원할때 돌아간다!
OriginalClass 가 상태를 저장 혹은 불러오기를 당하는 클래스이다. 따라서 해당 클래스 내부에는 saveStatesToMemento
그리고 getStatesFromMemento
와 같이 state 를 꺼내고 불러오는 메소드를 만들어 준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class OriginalClass {
private String state1;
private String state2;
public OriginalClass (String state) {
this.state1 = state1;
this.state2 = state2;
}
public Memento saveStatesToMemento(){
return new Memento(state1, state2);
}
public void getStatesFromMemento(Memento memento){
state1 = memento.getStates().get("state1");
state2 = memento.getStates().get("state2");
}
}
public class Memento {
private Map<String, String> statesMap = new HashMap<String, String>();
public Memento(String state1, String state2) {
statesMap.put("state1", state1);
statesMap.put("state2", state2);
}
public Map<String, String> getStates() {
return statesMap;
}
}
그러한 상태들은 Memento class 를 통해서 왔다 갔다 한다! 이제 이 Memento 들을 list 로 저장하는 객체만 있으면 된다! 보통 caretaker 라는 class 명을 사용한다!
1
2
3
4
5
6
7
8
9
10
11
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state){
mementoList.add(state);
}
public Memento get(int index){
return mementoList.get(index);
}
}
언제 쓰면 좋을까 ?
당연히 예전의 상태를 저장하고 있어야하는 경우에 사용되면 좋을 것이다! 우리 플랫폼의 경우에는 글을 작성하는 상황에서 메멘토 패턴을 적용 시켜 볼 수 있을 것 같다.
글을 작성하다 보면 간혹 ctrl + z 로도 안되는 상황이 가끔 있는데 20초에 한번씩 저장하고 caretaker 에 하나씩 하나씩 쌓다가 글을 post 하면 memento 를 싹 날려버리는 방식으로 진행하면 좋을 거 같다는 생각이 들었다!
뭔가 비슷하지만 적합하지 않은 사례도 있을 것 같다. 우리 플랫폼은 또 revision 이라고 어떤 글을 수정하면 수정하기 전 상태를 저장해놓고있는데 이 기록은 굉장히 오래 유지가 되어야한다. 따라서 여기에서는 메멘토 패턴을 적용하기에는 memory 사용량이 문제가 될것같다. 여기에는 적합하지 않은거 같다!!
장점이 뭘까?
이렇게 구현을 하면 또 저장하고 불러오는 동작들이 caretaker에게 위임이 되기에 originalClass 는 깔끔하게 유지할 수 있다.
단점이 뭘까?
메모리에 해당 기록이 계속 쌓이게 되면 사용량이 많이 늘어날것이다. 따라서 적절할때 flush 해주는 동작이 필요할것 같다!