SlideShare une entreprise Scribd logo
1  sur  20
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

Contenu connexe

Tendances

좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
Daum DNA
 

Tendances (20)

Proxy, chain of responsibility, command pattern
Proxy, chain of responsibility, command patternProxy, chain of responsibility, command pattern
Proxy, chain of responsibility, command pattern
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
Social game programming footage 6 setting up db cache system
Social game programming footage 6 setting up db cache systemSocial game programming footage 6 setting up db cache system
Social game programming footage 6 setting up db cache system
 
[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술[스프링 스터디 3일차] 데이터엑세스기술
[스프링 스터디 3일차] 데이터엑세스기술
 
Hacosa js study 6th
Hacosa js study 6thHacosa js study 6th
Hacosa js study 6th
 
Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조Ksug2015 - JPA3, JPA 내부구조
Ksug2015 - JPA3, JPA 내부구조
 
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
 
Java JPA
Java JPAJava JPA
Java JPA
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
추억의 자바스크립트
추억의 자바스크립트추억의 자바스크립트
추억의 자바스크립트
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
 
Jsp 기본요소
Jsp 기본요소Jsp 기본요소
Jsp 기본요소
 
D3.js
D3.jsD3.js
D3.js
 
Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑Ksug2015 - JPA2, JPA 기초와매핑
Ksug2015 - JPA2, JPA 기초와매핑
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄Domain-Driven-Design 정복기 2탄
Domain-Driven-Design 정복기 2탄
 
[Week5]R_scraping
[Week5]R_scraping[Week5]R_scraping
[Week5]R_scraping
 

En vedette

하둡완벽가이드 Ch9
하둡완벽가이드 Ch9하둡완벽가이드 Ch9
하둡완벽가이드 Ch9
HyeonSeok Choi
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정
HyeonSeok Choi
 

En vedette (20)

실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7실무로 배우는 시스템 성능 최적화 Ch7
실무로 배우는 시스템 성능 최적화 Ch7
 
실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6실무로 배우는 시스템 성능 최적화 Ch6
실무로 배우는 시스템 성능 최적화 Ch6
 
HTTPS
HTTPSHTTPS
HTTPS
 
HTTP 완벽가이드 16장
HTTP 완벽가이드 16장HTTP 완벽가이드 16장
HTTP 완벽가이드 16장
 
Elastic search 클러스터관리
Elastic search 클러스터관리Elastic search 클러스터관리
Elastic search 클러스터관리
 
하둡완벽가이드 Ch9
하둡완벽가이드 Ch9하둡완벽가이드 Ch9
하둡완벽가이드 Ch9
 
Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정Java 초보자를 위한 hadoop 설정
Java 초보자를 위한 hadoop 설정
 
실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1실무로배우는시스템성능최적화 Ch1
실무로배우는시스템성능최적화 Ch1
 
HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.HTTP 완벽가이드 6장.
HTTP 완벽가이드 6장.
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
 
HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.HTTP 완벽가이드 1장.
HTTP 완벽가이드 1장.
 
Logstash, ElasticSearch, Kibana
Logstash, ElasticSearch, KibanaLogstash, ElasticSearch, Kibana
Logstash, ElasticSearch, Kibana
 
Pair RDD - Spark
Pair RDD - SparkPair RDD - Spark
Pair RDD - Spark
 
Learning spark ch1-2
Learning spark ch1-2Learning spark ch1-2
Learning spark ch1-2
 

Similaire à DDD Start Ch#3

Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
Hyosang Hong
 
도메인 객체의 생명주기
도메인 객체의 생명주기도메인 객체의 생명주기
도메인 객체의 생명주기
ukjinkwoun
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
sung ki choi
 
Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0
cho hyun jong
 
HTML5 스펙 소개
HTML5 스펙 소개HTML5 스펙 소개
HTML5 스펙 소개
Toby Yun
 
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
Sang Don Kim
 

Similaire à DDD Start Ch#3 (20)

Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
CouchDB - Introduction - Korean
CouchDB - Introduction - KoreanCouchDB - Introduction - Korean
CouchDB - Introduction - Korean
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
도메인 객체의 생명주기
도메인 객체의 생명주기도메인 객체의 생명주기
도메인 객체의 생명주기
 
2019 lightning talk_1
2019 lightning talk_12019 lightning talk_1
2019 lightning talk_1
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 
3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐3. 마이크로 서비스 아키텍쳐
3. 마이크로 서비스 아키텍쳐
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
 
2-2. html5
2-2. html52-2. html5
2-2. html5
 
Introduction to mongo db
Introduction to mongo dbIntroduction to mongo db
Introduction to mongo db
 
REST API 설계
REST API 설계REST API 설계
REST API 설계
 
Hibernate5.x
Hibernate5.xHibernate5.x
Hibernate5.x
 
Oracle DB를 AWS로 이관하는 방법들 - 서호석 클라우드 사업부/컨설팅팀 이사, 영우디지탈 :: AWS Summit Seoul 2021
Oracle DB를 AWS로 이관하는 방법들 - 서호석 클라우드 사업부/컨설팅팀 이사, 영우디지탈 :: AWS Summit Seoul 2021Oracle DB를 AWS로 이관하는 방법들 - 서호석 클라우드 사업부/컨설팅팀 이사, 영우디지탈 :: AWS Summit Seoul 2021
Oracle DB를 AWS로 이관하는 방법들 - 서호석 클라우드 사업부/컨설팅팀 이사, 영우디지탈 :: AWS Summit Seoul 2021
 
Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0Tadpole DB Hub 1.0.0
Tadpole DB Hub 1.0.0
 
HTML5 스펙 소개
HTML5 스펙 소개HTML5 스펙 소개
HTML5 스펙 소개
 
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
[Td 2015]각이 다른 mvc6! 그 여섯 번째 이야기!(최지훈)
 

Plus de HyeonSeok Choi

대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
HyeonSeok Choi
 

Plus de HyeonSeok Choi (12)

밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
 
밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2밑바닥부터시작하는딥러닝 Ch2
밑바닥부터시작하는딥러닝 Ch2
 
프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2프로그래머를위한선형대수학1.2
프로그래머를위한선형대수학1.2
 
알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04알고리즘 중심의 머신러닝 가이드 Ch04
알고리즘 중심의 머신러닝 가이드 Ch04
 
딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04딥러닝 제대로시작하기 Ch04
딥러닝 제대로시작하기 Ch04
 
밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05밑바닥부터시작하는딥러닝 Ch05
밑바닥부터시작하는딥러닝 Ch05
 
Cluster - spark
Cluster - sparkCluster - spark
Cluster - spark
 
Elastic search 검색
Elastic search 검색Elastic search 검색
Elastic search 검색
 
Erlang
ErlangErlang
Erlang
 
데이터 과학 입문 13장
데이터 과학 입문 13장데이터 과학 입문 13장
데이터 과학 입문 13장
 
데이터 과학 입문 5장
데이터 과학 입문 5장데이터 과학 입문 5장
데이터 과학 입문 5장
 
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
대용량아키텍처와성능튜닝 8장성능엔지니어링정의와범위
 

DDD Start Ch#3

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