Download - DDD Start Ch#3
DDD START!Ch3. Aggregate
아꿈사Cecil
도메인 객체의 특징 #1다른 객체와 복잡한 상호 의존 관계를 가짐
도메인 객체의 특징 #2각 도메인 객체는 생명주기 동안 여러가지 상태를 가짐
(Order, Orderline, Shipping, Address…)
생명 주기 및 의존 관계로 인하여복잡해진 도메인 모델을 어떻게 관리하면 될까 ?
Aggregate( 애그리거트 )
하나의 단위로 취급할 수 있는 도메인 오브젝트들 (Entity, Value) 의 클러스터
- Martin Fowler(http://martinfowler.com/bliki/DDD_Aggregate.html)
애그리거트의 역할도메인 객체의 소유권과 경계를 명확하게
정의하여 객체들의 생명주기 동안 일관성을 유지하게 함
이를 통해 모델을 이해하는데 도움을 준다- Eric Evans
(Domain Driven Design)
주문 (Aggregate)상품 회원애그리거트 기반의 도메인 모델
• 한 애그리거트에 속한 객체는 동일한 생명 주기를 가짐• 애그리거트의 경계 기준은 도메인 규칙과 요구사항• 단순한 소유 관계가 기준은 아님
• ex) 상품과 리뷰• 일반적으로 애그리거트는 한개의 Entity 객체와 다수의
Value 객체로 구성됨
애그리거트의 특징
• 애그리거트의 대표 엔티티 객체• 애그리거트 전체의 일관성 ( 도메인 규칙 ) 을 관리하는 주체• 루트는 애그리거트가 제공해야하는 도메인의 기능을 구현• 외부 객체는 애그리거트에 속한 객체를 직접 변경하면 안됨
애그리거트 루트 (ROOT)
주문 (Aggregate)
애그리거트 루트 : 예제
• 단순히 필드를 변경하는 set 메서드는 Public 안됨• 내부 객체를 외부에 노출하지 않음• Value 타입은 불변 객체로 구현
애그리거트를 위한 습관
• 트랜잭션의 범위는 작을수록 좋음• 한 트랜잭션에서는 한 개의 애그리거트만 수정하는 것이
유리• 한 트랜잭션에서 2 개 이상의 애그리거트를 수정이
필요할때• 응용 서비스에서 두개의 애그리거트를 수정하도록 구현• 도메인 이벤트를 이용하여 비동기로 처리 (10 장 )
트랜잭션의 범위
• 객체의 영속성을 처리하는 리포티터리는 애그리거트 단위로 존재
• 리포지터리가 제공해야 하는 최소 기능• save: 애그리거트 저장• findById: ID 로 애그리거트 조회
• 리포지터리의 구현• RDBMS: 트랜잭션을 사용• Mongodb: 애그리거트를 한개의 문서로 저장
리포지터리와 애그리거트
• 애그리거트 직접 참조
• ID 를 사용한 참조
애그리거트 사이의 참조
• JPA 등의 연관된 객체 로딩 기능을 통해 쉽게 구현 가능• 단점
• 애그리거트 간의 의존도를 높여 변경을 어렵게 함• 성능 이슈가 발생할 수 있음
• 즉시 로딩 / 지연 로딩• 확장 어려움
• 서로 다른 DBMS 를 사용 or 다른 기술을 사용하는 경우 직접 구현해야 함
애그리거트 직접 참조
• DB 테이블에서의 외래키를 사용 하는것과 유사• 장점
• 애그리거트의 경계를 명확히하고 , 의존도를 제거• 구현 복잡도가 낮음• 확장에 용이
ID 를 사용한 참조
서비스에서 필요한 애그리거트를 로딩
• ID 로 참조할 경우 여러 애그리거트를 읽어야할 때 성능 문제가 발생할 수 있음• Ex) 고객의 주문 리스트 조회 ( 첫 상품 정보가 표시되어야 함 )
• JPA 로딩 기능 보다 전용 조회 쿼리 사용 or MyBatis 기술 이용• 코드가 복잡해지지만 성능을 높일 수 있음
ID 를 사용한 참조와 조회 성능(JPA)
• 개념적인 애그리거트와 요구사항을 충족하는 것이 관계가 없는 경우가 있음• ex) Category, Product• 개념적으로는 Category: Product = 1: N 집합 관계• 요구사항에 Paging 이 포함된다면 ??
• 개념이 아니라 요구사항을 고려하여 연관 관계를 지정해야 함
애그리거트 사이의 집합 연관
• 애그리거트가 가진 데이터를 이용하여 다른 애그리거트를 생성할 경우 구현을 고려
애그리거트를 팩토리로 사용
• 최범균 . DDD START! 도메인 주도 설계 구현과 핵심 개념 익히기 . 서울시 마포구 ( 주 ) 지앤선 , 2016.
• MARTINFLOWLER.COM, http://martinfowler.com/bliki/DDD_Aggregate.html
• Eric Evans, Domain Driven Design( 이대엽 옮김 ). 경기도 파주시 문발로 위키북스 , 2011.
References