Customer (Aggregate 외부 객체) 는 Car, Engine 을 를 참조하거나 DB 에서 조회할 수 있음
Car 내의 Tire 에 대한 참조는 가질 수 없음
Car, Wheel, Tire 는 각각 Entity
Rule
root entity - Global Identity + responsible for checking invariants (불변함을 검사할 책임)
entities in boundary - Local Identity. Aggregate 내에서만 unique
Aggregate 외부에서는 root entity 를 제외한 내부 구성요소를 참조할 수 없다
내부 entity 참조 전달은 가능하지만 일시적으로만 사용해야 한다
value object 사본 전달은 상관 없음
db query 시 root 만 직접 획득 -> 다른 객체는 모두 aggregate 를 탐색
aggregate 내 객체는 다른 aggregate 의 root 만 참조할 수 있음
삭제 연산은 aggregate 에 속한 모든 요소를 한 번에 제거해야 함
Factory
aggregate 생성이 복잡해지거나 내부 구조를 너무 많이 드러내는 경우 -> 캡슐화
복잡한 객체 조립 과정을 캡슐화 + 클라이언트가 인스턴스화되는 객체의 구현(concrete) 클래스를 참조할 필요가 없는 인터페이스 제공
형태
factory method, abstract factory, builder
Invariant logic 의 위치
Factory 는 이미 내부 구조를 알고 있고, 구현과 밀접하게 관련이 있으므로
Invariant logic 를 factory 에 두어서 생성물의 복잡한 요소를 줄이는 것도 이점
불변식은 무엇인지 ❓
Repository
ENTITY, VALUE 를 탐색하기 위한 진입점
DDD 의 목표는 기술보다는 도메인에 대한 모델이 집중하는 건데
개발자가 SQL query 를 작성하여 query service 에 보내고 결과를 constructor or factory 에 전달한다면
=> 모델에 집중하기 힘들어짐
=> 객체를 query 를 통해 제공되는 데이터의 컨테이너로 여기게 됨
=> 전체 설계가 데이터 처리 방식으로 나아감
Repository 는 특정 타입의 객체를 하나의 개념적 집합으로 나타낸다
CrudRepository
Aggregate Root 에만 Repository 를 제공하고 모든 객체 저장과 접근은 Repository 에 위임 -> 클라이언트가 모델에 집중
Aggregate
데이터의 변경 단위로 다루는 연관 객체의 묶음, root + boundary
Rule
Factory
aggregate 생성이 복잡해지거나 내부 구조를 너무 많이 드러내는 경우 -> 캡슐화
복잡한 객체 조립 과정을 캡슐화 + 클라이언트가 인스턴스화되는 객체의 구현(concrete) 클래스를 참조할 필요가 없는 인터페이스 제공
형태
factory method, abstract factory, builder
Invariant logic 의 위치
Factory 는 이미 내부 구조를 알고 있고, 구현과 밀접하게 관련이 있으므로 Invariant logic 를 factory 에 두어서 생성물의 복잡한 요소를 줄이는 것도 이점
불변식은 무엇인지 ❓
Repository
ENTITY, VALUE 를 탐색하기 위한 진입점
DDD 의 목표는 기술보다는 도메인에 대한 모델이 집중하는 건데
개발자가 SQL query 를 작성하여 query service 에 보내고 결과를 constructor or factory 에 전달한다면 => 모델에 집중하기 힘들어짐 => 객체를 query 를 통해 제공되는 데이터의 컨테이너로 여기게 됨 => 전체 설계가 데이터 처리 방식으로 나아감
Repository 는 특정 타입의 객체를 하나의 개념적 집합으로 나타낸다
Aggregate Root 에만 Repository 를 제공하고 모든 객체 저장과 접근은 Repository 에 위임 -> 클라이언트가 모델에 집중
구현 시