- 객체 모델을 사용하면 조직 계층을 나타내는 구성 요소 패턴을 아주 자연스럽게 보여줄 수 있다.
- 조상, 형제, 자손 및 다른 일반적인 관계의 객체를 얻는 메서드도 쉽게 추가할 수 있다.
- 반면 관계형 스키마로는 이러한 구조를 표현하기 어렵다.
- 이런 스키마를 조작하려면 느리고 불편한 다수의 조인이 필요하다.
- 객체를 지속하는 방법에 서로 연관된 테이블 행만 있는 것은 아니다.
- 객체를 지속하는 다른 방법으로 객체 그래프 전체를 한 테이블의 큰 객체 하나에 기록하는 직렬화가 있다.
- 이 직렬화는 메먼토 패턴의 한 형태이다.
메멘토 패턴(Memento Pattern)은 객체의 상태를 저장하고 이전 상태로 복원할 수 있게 해주는 디자인 패턴 중 하나입니다.
일반적으로 객체는 그 상태를 캡슐화하고 있습니다. 메멘토 패턴은 이 상태를 나타내는 객체를 생성하고, 이를 다른 객체에 저장하여 이전 상태를 복원할 수 있도록 합니다. 이 때 상태를 저장하는 객체를 메멘토(Memento)라고 부르며, 이 객체는 보통 생성자를 통해 초기화되며, 상태를 복원하기 위한 get 메서드를 제공합니다.
예를 들어, 텍스트 편집기에서 사용자가 작성한 문서를 저장하고, 특정 시점의 문서 상태로 돌아갈 수 있는 "실행 취소" 기능을 구현할 때 메멘토 패턴을 사용할 수 있습니다.
메멘토 패턴은 상태를 저장하는 객체를 별도의 클래스로 분리하여 캡슐화하므로 객체의 내부 상태가 외부에 노출되지 않아 안전합니다. 또한 상태를 복원하기 위한 인터페이스를 제공하여 캡슐화된 상태 객체를 안전하게 조작할 수 있습니다.
작동 원리
- 직렬화에는 이진(BLOB)이나 텍스트 문자(CLOB)가 있다.
- BLOB의 장점
- 플랫폼이 지원하면 프로그래밍하기 쉽고 최소한의 공간을 사용한다
- BLOB의 단점
- 데이터베이스가 이진 데이터 형식을 지원해야 하며, 객체가 없으면 그래프를 재구성할 수 없으므로 일반적인 조회 방법으로는 필드를 볼 수 없다.
- 가장 심각한 문제는 버전 관리다. 예를 들어, 부서 클래스를 변경하는 경우 이전의 모든 직렬화를 읽지 못하게 될 수 있다.하지만 데이터는 데이터베이스에 오래 유지되므로 이건 사소한 문제이다.
- 데이터베이스가 이진 데이터 형식을 지원해야 하며, 객체가 없으면 그래프를 재구성할 수 없으므로 일반적인 조회 방법으로는 필드를 볼 수 없다.
- CLOB을 사용하면 부서 그래프를 필요한 모든 정보가 포함된 텍스트 문자열로 직렬화할 수 있다.
- 텍스트 문자열은 간단하게 테이터베이스를 조회할 수 있다.
- 그러나 텍스트 방식은 일반적으로 공간이 더 필요하며 사용하는 텍스트 형식에 맞는 파서를 만들어야 한다.
- 또한 이진 직렬화보다 느릴 가능성이 높다.
- XML을 사용하면 CLOB의 여러 단점을 극복할 수 있다.
- XML 파서는 쉽게 구할 수 있으므로 직접 작성할 필요가 없다.
- 다만 사용 공간이 많다라는 단점은 XML로 해결되지 않는다. 오히려 XML의 자세한 형식때문에 문제가 악화된다.
- 직렬화 LOB를 사용할 때는 식별자 문제를 알고 있어야 한다.
- 예를 들어, 주문에서 고객 세부정보에 직렬화를 사용할 때, 고객 LOB를 주문 테이블에 넣는 방법은 좋지 않다.
- 이렇게 하면 고객 데이터가 모든 주문에 복사되므로 업데이트 문제로 이어질 수 있다.
- 반면 주문할 당시의 고객 데이터의 스냅샷을 저장하려는 경우는 오히려 좋은 방법이고 임시 관계 문제가 방지된다.
- 전형적인 관계형 개념에 맞게 주문마다 고객 데이터를 업데이트 하려면 고객 테이블에 LOB를 배치해 여러 주문에서 이를 연결할 수 있게 해야한다.
사용 시점
- 직렬화 LOB는 유용성에 비해 그리 자주 고려되지 않는다.
- XML을 적용하면 손쉬운 텍스트 접근을 구현할 수 있는 장점도 있다.
- 그러나 SQL을 사용해 구조를 쿼리할 수 없다는 점은 가장 큰 단점이다.
- 이 패턴은 객체 모델의 한 부분을 떼어내고 LOB를 나타내는 데 사용할 수 있을 때 가장 적합하다.
- 쿼리할 가능성이 거의 없는 객체를 애플리케이션 바깥으로 분리하는 방법이라고 보면 된다.
직렬화LOB에서 언급하는 그래프는 객체 간의 연관 관계를 나타내는 그래프를 말합니다. 자료구조 그래프와는 조금 다르게 객체 간의 연관 관계를 나타내기 위해 사용되는 개념입니다. 직렬화LOB에서 언급하는 그래프는 객체 간의 연관 관계를 데이터베이스에서 효과적으로 저장하고 조회할 수 있도록 돕는 개념이며, 객체 모델과 데이터베이스 스키마 간의 매핑 작업에서 중요한 역할을 합니다.
'Study > 엔터프라이즈 애플리케이션 아키텍처 패턴' 카테고리의 다른 글
제12장 객체-관계형 구조 패턴 : 포함 값 (0) | 2023.03.28 |
---|---|
제12장 객체-관계형 구조 패턴 : 연관 테이블 매핑 (0) | 2023.03.28 |
09장 - 도메인 논리 패턴 (0) | 2023.02.20 |
05장 - 동시성 (0) | 2023.02.14 |
03장 - 관계형 데이터베이스 매핑 02 - 데이터 읽기 / 구조적 매핑 패턴 (0) | 2023.02.08 |