-
part 3. 애그리거트책 정리/도메인 주도 개발 시작하기 2023. 7. 23. 11:01
애그리거트
애그리거트
애그리거트란?
- 변경의 단위다.
- 데이터를 변경하는 단위로 다뤄지는 객체의 모임을 애그리게이트라고한다.
- 데이터변경의 단위가 되므로 트랜잭션이나 로크와도 밀접한관계를 갖는다.
저자의 경험
- 다수의 애그리거트가 한개의 엔티티 객체만 갖는 경우가 많았으며, 두 개이상의 엔티티로 구성되는 애그리거트는 드믈었다.
애그리거트 루트
애그리거트 루트의 역할
- 애그리거트가 제공해야 할 도메인 기능을 구현
- 업무규칙을 무시하고 직접 DB테이블의 데이터를 수정하는 것과 같은 결과를 만든다 ← 얼마나 자주 발생하는가?
주의사항
- 애그리거트는 독립적이어야함
- 한 트랜잭션에서는 한 개의 애그리거트만 수정해야 한다.
- 외부에서 내부 밸류타입을 꺼내서 사용하지 못하도록 주의 해야한다.
리포지터리와 애그리거트
NoSQL 에서는 어떻게 저장할까?
- 노티피케이션 객체를 생성하도록 만들어 주어야 한다.
public Interface { void Id(UserId id); void Name(UserName name); } public class UserDataModelBuilder : IUserNotification{ private UserId id; private UserName name; public void Id(UserId id){ this.id = id } public void Name(UserName name){ this.name = name } public UserDataModel Build(){ return new UserDataModle{ Id = id.value Name = name.value } } public class User // domain { private readonly UserId id; private UserName name; // 수만가지의 도메인 로직들 public void Notify(IUserNotification note){ note.Id(id); note.Name(name) } } public Repositoy{ public void save(User user){ var userDataModelBuilder = new UserDataModelBuilder(); user.Notify(userDataModelBuilder); var userDataModel = userDataModelBuilder.Build(); context.User.Add(userDataModel); context.SaveChanges(); } }
출처: 도메인 주도 설계 철저 입문 (위키북스)
ID를 이용한 애그리거트 참조
ID를 사용하지 않으면 3가지 발생할 수 있는 문제
- 편한 탐색 오용
- 성능에 대한 고민
- 확장 어려움
다만 사용시 N+1dp 주의하라
애그리거트 간 집합 연관
애그리거트를 팩토리로 사용하기
질문
- Store라는 다른 애그리거트에서 product를 생성하는 것은 옳은 일인가?
- 도메인 서비스를 생성해야할 때인가?
- 아직 배우지 않아서 이렇게 알려주는 것인가?
Factory를 설계하는 여러가지 방법 (패턴 학습 추가하기)
- Factory Method Pattern
- Abstract Factory Pattern
- Builder Pattern
- Factory Pattern
잘설계된 Factory의 2가지 요건
- 각 생성 방법은 원자적이어야하며, 생성된 객체나 Aggregate불변식을 모두 지켜야 한다.
- Factory는 생성된 클래스보다 생성하고자 하는 타입으로 추상화 돼야한다.
'책 정리 > 도메인 주도 개발 시작하기' 카테고리의 다른 글
part 6. 응용 서비스와 표현 영역 (0) 2023.08.13 part 5. 스프링 데이터 JPA를 이용한 조회 기능 (0) 2023.08.06 part 4. 리포지터리와 모델 구현 (0) 2023.07.29 part 2. 아키텍처 개요 (0) 2023.07.16 part 1. 도메인 모델 시작하기 (0) 2023.07.08