본문 바로가기

Coding Note

[Design pattern] Memento

Memento pattern : 영화 <메멘토>를 보면 주인공이 매일 아침 기억을 되살리기 위해 자신의 몸에 적어둔 내용들로부터 지난 시간동안 일어난 일들을 인지하는 장면을 볼 수 있다. Memento는 (죽은자의)'기억', 무언가를 기억하기 위한 기념품을 뜻하는 단어로 클래스 설계 관점에서 객체의 정보를 저장해야 할 필요가 있을 때 적용할 수 있는 패턴으로서 이름붙였다. 단순한 데이터라면 문제가 없겠지만, 캡슐화된 객체에서 데이터를 저장해야 한다면 얘기가 달라진다. 저장을 위해서는 대상 객체의 데이터에 접근해야 하는데, 클래스의 캡슐화를 깰 수는 없으므로 난감한 상황이 되어버린다. 이를 해결하기 위해 저장이 필요한 객체의 데이터 덩어리를 만들어 관리클래스에게 넘겨주어 데이터 덩어리째 관리하게 할 수 있다. 백업된 데이터 또한 캡슐화되니 일석이조의 효과이다. 이러한 클래스 구조를 Memento pattern이라 한다. (이 패턴은 독특한 클래스 구조를 띄므로 구조패턴이라 분류되기도 하고, 클래스간 데이터의 흐름을 제어하는 행위로 본다면 행위패턴으로 되기도 한다.)

 

 

memento는 관리 대상 클래스로 부터 생성되어 나온 기억의 덩어리이고 관리클래스에서는 이 덩어리를 적절한 형태로 보관하면 된다. 복구가 필요하다면 이 덩어리를 다시 관리 대상 클래스에 넣어 저장해 두었던 데이터로 복구하게 한다. Memento pattern은 각 클래스에 대한 기능과 구조가 명확하기 때문에 코드의 가독성을 높여주고, 유지 보수의 관점에서 높은 효율을 보인다.

 

다만, memento의 구현에 저장하려는 대상의 데이터와 결합도가 높기때문에 저장하려는 데이터의 형태가 바뀐다면 백업과 복구의 구현에도 변화가 생기게 된다. 하지만 이런 부분은 클래스의 전체적인 흐름에 영향을 미치지 않는 부분이므로 감수할 만 하다.

 

만약 백업된 특정 memento의 정보를 확인하려고 한다면, 데이터에 대한 접근권한을 설정하여 적절하게 처리할 수 있을것이다. 포토샵의 히스토리를 생각해본다면, 히스토리의 그려진 최종 상태만을 엑세스 가능한 데이터로 열어두며 그 외 작업 시간, 해당 히스토리때의 레이어 상태 등은 전혀 보여줄 필요가 없다.

이처럼 memento에서 외부에서 접근 가능한 데이터를 narrow interface라 하고, 외부에서 접근이 불가능하며 Originator에서만 접근가능한 데이터를 wide interface라 한다.

 

Caretaker는 단순 백업용으로 단일 memento만 관리할 수도 있고, 스택, 큐 등을 이용하여 히스토리로써 관리할 수도 있다. 또한 serialization을 통해서 파일로 관리하도록 기능을 확장할 수 있다.

 

이 패턴은 데이터의 백업이 필요한 모든 상황에서 사용될 수 있다. 주로 에디터 프로그램의 'Undo' 기능이나 롤백(rollback)기능에 적용된다. 롤백이 필요한 예로는 데이터베이스의 트랜젝션, 프로그램 설치위자드 등을 들 수 있다.

 

한줄요약 : 백업을 위해서도, 백업된 데이터를 위해서도 객체지향적인 설계가 예외일수는 없다.

'Coding Note' 카테고리의 다른 글

[Design pattern] Visitor  (0) 2013.03.27
[Design pattern] Template method  (0) 2013.03.27
[Design pattern] Mediator  (0) 2013.03.25
[Design pattern] Interpreter  (0) 2013.03.18
[Design pattern] Proxy  (1) 2013.03.07