ddd start ch#3

20
DDD START! Ch3. Aggregate 아아아 Cecil

Upload: hyeonseok-choi

Post on 13-Jan-2017

179 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: DDD Start Ch#3

DDD START!Ch3. Aggregate

아꿈사Cecil

Page 2: DDD Start Ch#3

도메인 객체의 특징 #1다른 객체와 복잡한 상호 의존 관계를 가짐

Page 3: DDD Start Ch#3

도메인 객체의 특징 #2각 도메인 객체는 생명주기 동안 여러가지 상태를 가짐

(Order, Orderline, Shipping, Address…)

Page 4: DDD Start Ch#3

생명 주기 및 의존 관계로 인하여복잡해진 도메인 모델을 어떻게 관리하면 될까 ?

Page 5: DDD Start Ch#3

Aggregate( 애그리거트 )

하나의 단위로 취급할 수 있는 도메인 오브젝트들 (Entity, Value) 의 클러스터

- Martin Fowler(http://martinfowler.com/bliki/DDD_Aggregate.html)

Page 6: DDD Start Ch#3

애그리거트의 역할도메인 객체의 소유권과 경계를 명확하게

정의하여 객체들의 생명주기 동안 일관성을 유지하게 함

이를 통해 모델을 이해하는데 도움을 준다- Eric Evans

(Domain Driven Design)

Page 7: DDD Start Ch#3

주문 (Aggregate)상품 회원애그리거트 기반의 도메인 모델

Page 8: DDD Start Ch#3

• 한 애그리거트에 속한 객체는 동일한 생명 주기를 가짐• 애그리거트의 경계 기준은 도메인 규칙과 요구사항• 단순한 소유 관계가 기준은 아님

• ex) 상품과 리뷰• 일반적으로 애그리거트는 한개의 Entity 객체와 다수의

Value 객체로 구성됨

애그리거트의 특징

Page 9: DDD Start Ch#3

• 애그리거트의 대표 엔티티 객체• 애그리거트 전체의 일관성 ( 도메인 규칙 ) 을 관리하는 주체• 루트는 애그리거트가 제공해야하는 도메인의 기능을 구현• 외부 객체는 애그리거트에 속한 객체를 직접 변경하면 안됨

애그리거트 루트 (ROOT)

주문 (Aggregate)

Page 10: DDD Start Ch#3

애그리거트 루트 : 예제

Page 11: DDD Start Ch#3

• 단순히 필드를 변경하는 set 메서드는 Public 안됨• 내부 객체를 외부에 노출하지 않음• Value 타입은 불변 객체로 구현

애그리거트를 위한 습관

Page 12: DDD Start Ch#3

• 트랜잭션의 범위는 작을수록 좋음• 한 트랜잭션에서는 한 개의 애그리거트만 수정하는 것이

유리• 한 트랜잭션에서 2 개 이상의 애그리거트를 수정이

필요할때• 응용 서비스에서 두개의 애그리거트를 수정하도록 구현• 도메인 이벤트를 이용하여 비동기로 처리 (10 장 )

트랜잭션의 범위

Page 13: DDD Start Ch#3

• 객체의 영속성을 처리하는 리포티터리는 애그리거트 단위로 존재

• 리포지터리가 제공해야 하는 최소 기능• save: 애그리거트 저장• findById: ID 로 애그리거트 조회

• 리포지터리의 구현• RDBMS: 트랜잭션을 사용• Mongodb: 애그리거트를 한개의 문서로 저장

리포지터리와 애그리거트

Page 14: DDD Start Ch#3

• 애그리거트 직접 참조

• ID 를 사용한 참조

애그리거트 사이의 참조

Page 15: DDD Start Ch#3

• JPA 등의 연관된 객체 로딩 기능을 통해 쉽게 구현 가능• 단점

• 애그리거트 간의 의존도를 높여 변경을 어렵게 함• 성능 이슈가 발생할 수 있음

• 즉시 로딩 / 지연 로딩• 확장 어려움

• 서로 다른 DBMS 를 사용 or 다른 기술을 사용하는 경우 직접 구현해야 함

애그리거트 직접 참조

Page 16: DDD Start Ch#3

• DB 테이블에서의 외래키를 사용 하는것과 유사• 장점

• 애그리거트의 경계를 명확히하고 , 의존도를 제거• 구현 복잡도가 낮음• 확장에 용이

ID 를 사용한 참조

서비스에서 필요한 애그리거트를 로딩

Page 17: DDD Start Ch#3

• ID 로 참조할 경우 여러 애그리거트를 읽어야할 때 성능 문제가 발생할 수 있음• Ex) 고객의 주문 리스트 조회 ( 첫 상품 정보가 표시되어야 함 )

• JPA 로딩 기능 보다 전용 조회 쿼리 사용 or MyBatis 기술 이용• 코드가 복잡해지지만 성능을 높일 수 있음

ID 를 사용한 참조와 조회 성능(JPA)

Page 18: DDD Start Ch#3

• 개념적인 애그리거트와 요구사항을 충족하는 것이 관계가 없는 경우가 있음• ex) Category, Product• 개념적으로는 Category: Product = 1: N 집합 관계• 요구사항에 Paging 이 포함된다면 ??

• 개념이 아니라 요구사항을 고려하여 연관 관계를 지정해야 함

애그리거트 사이의 집합 연관

Page 19: DDD Start Ch#3

• 애그리거트가 가진 데이터를 이용하여 다른 애그리거트를 생성할 경우 구현을 고려

애그리거트를 팩토리로 사용

Page 20: DDD Start Ch#3

• 최범균 . DDD START! 도메인 주도 설계 구현과 핵심 개념 익히기 . 서울시 마포구 ( 주 ) 지앤선 , 2016.

• MARTINFLOWLER.COM, http://martinfowler.com/bliki/DDD_Aggregate.html

• Eric Evans, Domain Driven Design( 이대엽 옮김 ). 경기도 파주시 문발로 위키북스 , 2011.

References