research

Distribution & Base Patterns

Distribution & Base Patterns

PoEAA의 나머지 중요 패턴들을 간결하게 정리한다. 프로젝트에서 당장 쓰지 않더라도, 개념을 알아두면 아키텍처 논의에서 도움이 된다.

Distribution Patterns

Fowler의 분산 객체 제1법칙

"Don't distribute your objects." (객체를 분산하지 마라.)

프로세스 간 호출은 프로세스 내 호출보다 수 배에서 수십 배 느리다. 분산이 필요한 것처럼 보여도, 가능한 한 하나의 프로세스에서 모든 계층을 돌려라.

Remote Facade

분산이 불가피할 때, 도메인 객체의 세밀한(fine-grained) 인터페이스를 거친(coarse-grained) 인터페이스로 감싼다. 10번의 getName(), getAddress(), getPhone() 호출 대신, 하나의 getPersonData() 호출로 필요한 모든 데이터를 한 번에 전달한다.

핵심: Remote Facade는 새로운 로직을 담지 않는다. 오직 호출 횟수를 줄이기 위한 포장일 뿐이다.

Data Transfer Object (DTO)

Remote Facade가 반환하는 직렬화 가능한 데이터 덩어리. 네트워크를 통해 전달할 수 있는 단순한 데이터 구조로, 비즈니스 로직은 전혀 없다. 여러 도메인 객체의 데이터를 하나의 DTO에 합쳐서 전송한다.

주의: 분산이 필요 없는 시스템에서 DTO를 남용하면 불필요한 간접 계층만 추가된다.

Base Patterns (자주 쓰이는 기반 패턴)

Gateway

외부 시스템이나 리소스에 대한 접근을 캡슐화하는 객체. Table Data Gateway, Row Data Gateway가 이 패턴의 특수화.

Mapper

두 독립적인 객체 간의 통신을 설정하는 객체. 양쪽 모두 Mapper의 존재를 모른다. Data Mapper가 대표적.

Registry

다른 객체가 공통 객체나 서비스를 찾을 수 있는 잘 알려진 객체. 글로벌 변수의 구조화된 대안. Identity Map을 담는 장소로 자주 쓰인다.

Layer Supertype

계층 내 모든 타입의 상위 타입. Domain Model의 모든 클래스가 DomainObject를 상속하면, 공통 기능(ID 관리 등)을 여기에 둔다.

Separated Interface

인터페이스를 구현과 다른 패키지에 둔다. Domain 계층이 Data Source 인터페이스를 정의하고, Data Source 계층이 이를 구현하면, Domain → Data Source 의존성 방향이 역전된다.

Value Object

동일성(identity)이 아닌 동등성(equality)으로 비교되는 작은 객체. Money, DateRange 같은 것들. 불변으로 만드는 것이 안전하다.

Plugin

컴파일 타임이 아닌 런타임에 클래스를 연결한다. 설정 파일로 어떤 구현을 쓸지 결정. Separated Interface + Factory의 조합.

Service Stub

테스트 시 외부 서비스를 대체하는 가짜 구현. Gateway + Separated Interface 패턴과 함께 쓰면 외부 서비스 없이도 도메인 로직을 테스트할 수 있다.

Record Set

테이블 형태의 인메모리 데이터 구조. SQL 결과를 표현하는 범용 데이터 구조로, .NET의 DataSet이 대표적. Table Module과 Table Data Gateway의 핵심 인프라.

O-R Structural Patterns (요약)

| 패턴 | 해결하는 문제 | |---|---| | Identity Field | 객체에 DB의 PK를 필드로 부여 | | Foreign Key Mapping | 객체 참조 ↔ 외래 키 변환 | | Association Table Mapping | 다대다 관계를 연결 테이블로 매핑 | | Dependent Mapping | 소유자 객체가 종속 객체의 매핑까지 담당 | | Embedded Value | 작은 Value Object를 소유자 테이블의 컬럼으로 매핑 | | Serialized LOB | 객체 그래프를 하나의 큰 필드에 직렬화 | | Single Table Inheritance | 클래스 계층 전체를 하나의 테이블에 | | Class Table Inheritance | 클래스마다 별도 테이블 | | Concrete Table Inheritance | 리프 클래스마다 별도 테이블 |

O-R Metadata Mapping Patterns (요약)

| 패턴 | 핵심 아이디어 | |---|---| | Metadata Mapping | 매핑 규칙을 메타데이터(XML 등)로 정의. ORM 도구의 핵심 기법 | | Query Object | SQL을 객체로 표현. 도메인 개발자가 SQL 없이 쿼리를 구성 | | Repository | 도메인 객체의 컬렉션처럼 보이는 인터페이스 뒤에 매핑 로직을 숨김 |