복잡성을 아주 효율적으로 다룰 수 있는 입증된 설계 아이디어에 대한 패턴을 제시하는 책
책의 순서를 뒤집어서 1,2부를 거꾸로 설명하는 것이 나아보여 역순으로 정리했다
- 아키텍처
- 시스템을 구성 요소로 나누는 최상위 수준의 분해
- 번복하기 어려운 시스템 설계에 대한 공유된 이해
- 패턴: 하나 이상의 반복적인 문제를 해결하는 데 효과적이고 공통적인 특정한 해결책
- 계층화
- 하위 계층이 상위 계층을 인식하지 못하는 구조의 시스템 구성
- 장점
- 단일 계층만으로도 일관성을 유지할 수 있다
- 다른 하위 계층으로 교체가 가능하다
- 표준화하기 쉬우며 의존성 최소화가 가능하다
- 단점
- 전체 계층이 효과적으로 캡슐화되지는 않는다
- 계층이 추가될 수록 성능이 저하된다
- 특정 기능의 경우 계층을 건너 뛰거나 필요하지 않을 수 있다
- 도메인 논리 계층 패턴
- 비즈니스 논리를 구성하는 계층을 작성하는 패턴
- 처음 구현은 로컬로 호출 할 수 있고 도메인 객체를 받는 메서드 시그니처를 사용하는 서비스를 작성하면서, 상위에 큰 규모의 원격 파사드나 인터페이스를 구현하는 방식으로 접근해 보자
- 종류: 트랜잭션 스크립트, 도메인 모델, 테이블 모듈 방식
- 트랜잭션 스크립트
- 사용자가 수행할 각 작업(비즈니스 논리)마다 프로시저를 하나씩 만드는 방식으로 프레젠테이션 단일 요청을 처리하게 한다
- 장점
- 가장 간단한 방식
- 행 데이터 게이트웨이, 테이블 게이트웨이 패턴과 잘 어울린다
- 트랜잭션 경계 설정이 매우 쉽다
- 단점
- 도메인 논리가 복잡해지면 복잡도가 매우 빠르게 상승한다
- 코드가 중복되는 현상이 심하다
- 도메인 모델
- 각 객체가 도메인 논리의 일부를 담당하게 하여 처리하는 방식.
- 동작과 데이터를 모두 포함하는 도메인 객체를 이용한다
- 매우 작은 규모의 인터페이스(메소드)를 사용해야 한다
- 장점
- 복잡한 논리를 쉽게 표현 가능하다
- 논리의 교체가 쉽다
- 데이터 매퍼 패턴과 잘 어울린다
- 단점
- 숙련되기 어렵다
- 복잡성이 초기에 매우 높다
- 객체가 비대해질 가능성이 높다 → 도메인 서비스로 해결 가능
- 테이블 모듈
- 데이터베이스 테이블을 기준으로 도메인 논리를 구성하는 방식
- 테이블이나 뷰의 모든 행에 대한 비즈니스 논리를 처리하는 단일 인스턴스를 생성하여 처리한다
- 테이블 당 클래스 하나로 도메인 논리를 구성한다
- 장점
- 테이블 기반 자료구조와 손쉬운 통합이 가능하다
- 레코드 집합 패턴과 매우 잘 어울린다
- 단점
- 미들웨어의 교체가 매우 어렵다
- .NET 계열처럼 레코드 집합 패턴 지원이 잘 되지 않는다면 안 쓰는게 낫다
- 서비스 계층
- 사용 가능한 작업의 집합을 설정하고 작업에 대한 어플리케이션 반응을 조율한다
- 명확한 API를 제공하며 트랜잭션 제어와 보안과 같은 기능을 담당하는 계층
- 도메인 모델이나 테이블 모듈 패턴 위에서 동작한다
- 구현 방식
- 도메인 파사드(서비스): 도메인 모델 위에서 작은 집합으로 구현된다
- 작업 스크립트: 리치 클래스의 집합으로 구현.
- 데이터 원본 아키텍처 패턴 = 데이터베이스 맵핑 패턴
- SQL의 접근을 도메인 논리와는 별도로 분리하고 개별 클래스에 배치하는 패턴
- 종류: 테이블 데이터 게이트웨이, 행 데이터 게이트웨이, 활성 레코드, 데이터 맵퍼
- 테이블 데이터 게이트웨이 ( like DAO )
- 테이블에 대한 게이트웨이 역할을 하는 객체.
- 테이블 당 인스턴스 하나를 생성하는 맵핑 패턴
- 장점
- 레코드 집합, 테이블 모듈 패턴과 매우 잘 어울린다
- 가장 간단하며 트랜잭션 스크립트와 잘 어울린다
- 행 데이터 게이트웨이
- 테이블 각 행 당 인스턴스 하나를 생성하는 맵핑 패턴
- 도메인 논리가 존재하면 활성 레코드 패턴이 된다
- 장점
- 단점
- 작성해야 하는 코드량이 많다
- 도메인 모델과는 어울리지 않는다
- 활성 레코드(Active Record)
- 테이블이나 뷰의 행을 랩핑하고, 도메인 논리가 추가되는 객체
- 장점
- 단점
- 비즈니스 논리가 복잡해 지면 적용하기 어렵다
- 데이터베이스 설계와 객체 설계가 결합된다
- 데이터 맵퍼 ( like ORM )
- 도메인 객체와 데이터베이스 사이를 격리하고 상호 변환하는 패턴
- 맵퍼 자체에 대한 독립성을 유지하는 계층
- 맵퍼를 직접 코딩할 때는 도메인 클래스나 도메인 루트 별로 하나씩 작성되나, 메타데이터 맵핑을 이용할 때는 단일 맵퍼 클래스를 사용하게 된다
- 장점
- 단점