Skip to content

Memento #4

@simoniful

Description

@simoniful

Memento Pattern은 구현의 세부 사항을 공개하지 않고, 즉 캡슐화를 위반하지 않고 객체의 이전 상태를 저장하고 복원할 수 있는 디자인 패턴입니다.

  • originator은 저장 또는 복원할 개체입니다.
    • 자체적으로 현재의 state를 저장하는 Memento 객체를 생성할 수 있습니다.
    • State를 복원하기 위해 Memento를 사용합니다.
  • memento는 저장된 상태를 나타냅니다.
    • originator의 state에 대한 스냅샷 역할을 하는 객체입니다.
    • originator 이외 객체의 접근으로부터 보호합니다.
    • memento를 immutable하게 만들고 생성자를 통해 데이터를 한 번만 전달합니다.
  • caretaker는 originator에게 저장을 요청하고 응답에 대한 메모를 받습니다. caretaker는 memento를 지속하고 나중에 memento를 원상태로 복구하기 위해 다시 원상태로 되돌릴 책임이 있습니다.
    • Memento 객체들을 저장하여 Originator의 동작을 추적합니다.
    • Memento의 내용을 조작하거나 검토하지 않습니다.

iOS 앱은 일반적으로 인코더를 사용하여 원본 상태를 메모로 인코딩하고 디코더를 사용하여 원본을 디코딩합니다. 이렇게 하면 인코딩 및 디코딩 논리를 여러 Initializer에 걸쳐 재사용할 수 있습니다. 예를 들어, JSON 인코더와 JSON 디코더는 객체를 각각 JSON 데이터로 인코딩 및 디코딩할 수 있습니다.

사용

프로그래밍을 하다 보면 객체의 내부 상태를 기록해둬야 할 때가 있습니다. 이러한 상황에는 오류에서 복구할 수 있도록 하거나 텍스트 편집기에서 실행 취소 기능을 구현할 때 필요합니다. 이러한 상황에서 객체의 상태를 기록해줘야 하는데 외부에 저장하거나 다른 객체에서 접근 가능하도록 하면 캡슐화를 위반하게 됩니다. 즉 상태를 저장할 클래스의 모든 내부 정보를 노출하지 않고 이러한 상태에 접근하는 것을 제한해줘야 하는데 이럴 때 메멘토 패턴을 사용할 수 있습니다.
 
memento 패턴에서 state를 기록하는 originator 객체가 state를 기록하고 이를 memento 객체에 저장합니다. memento 객체는 originator 객체를 제외하고는 접근 할 수 없도록 만듭니다. 이러한 memento 객체들은 caretaker라는 객체에 저장되며 caretaker는 제한된 인터페이스를 통해서 memento 객체를 다루기 때문에 memento 객체의 내부를 조작할 수 없습니다. 하지만 originator는 memento 객체에 자유롭게 접근할 수 있기 때문에 원하는 state로 복원할 수 있게 됩니다. 따라서, 캡슐화를 위반하지 않고 객체의 state 스냅샷을 생성할 수 있습니다. caretaker가 originator의 state 기록을 유지하므로 originator의 코드를 단순하게 가져갈 수 있게 됩니다.

주의 사항

Codable 속성을 추가하거나 제거할 때 주의하십시오. 인코딩과 디코딩 모두 오류를 발생시킬 수 있습니다. try!를 사용하여 이러한 호출을 강제로 해제하면 필요한 데이터가 누락되면 앱이 충돌합니다. 이를 피하기 위해서는 무조건적인 성공 상황이 아니라면 try!를 사용하지 마십시오. 또한 모델을 변경할 때는 미리 계획을 세워야 합니다.

예를 들어 모델을 버전화하거나 버전화된 데이터베이스를 사용할 수 있습니다. 그러나 마이그레이션을 처리하는 방법을 신중하게 고려해야 합니다. 새 버전이 나타날 때마다 이전 데이터를 삭제하거나, 이전 데이터에서 새 데이터로 변환하기 위한 업그레이드 경로를 생성하거나, 이러한 접근 방식을 조합하여 사용할 수도 있습니다.

클라이언트가 memento 객체를 너무 많이 생성하면 메모리가 많이 사용됩니다. caretaker는 오래된 memento 객체를 삭제 할 수 있도록 originator의 생명 주기를 추적해야 합니다. 즉 자원을 소비해야 합니다. 몇 몇 언어에서는 originator만 memento 객체에 접근할 수 있도록 만드는 것이 어려울 수 있습니다.

정리

  • 일종의 내부 DB의 구성에 있어서 인코딩과 디코딩의 문제와 유사합니다.
  • memento 패턴을 사용하여 개체를 저장하고 복원할 수 있습니다. originator, memento, 그리고 caretaker의 유형을 포함합니다.
  • originator는 저장할 개체이고, memento는 저장된 상태이며, caretaker는 메모를 처리, 유지 및 검색합니다.
  • iOS는 memento를 인코딩하기 위한 인코더와 디코딩하기 위한 디코더를 제공합니다. 따라서 인코딩 및 디코딩 논리를 여러 originator에 걸쳐 사용할 수 있습니다.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions