트랜잭션 스크립트 패턴 (전통적 패턴)
액티브 레코드 패턴 (낮은 수준의 도메인 모델 방식)
도메인 모델 패턴
애그리거트 패턴
복잡성을 관리할 단위를 구분(Aggregate)하여 표현
대부분 한개의 Entity와 여러 개의 VO구성
Value Object
Entity
도메인 모델 예시
애그리거트 상세 설명
- 관련 객체를 하나로 묶은 군집
- 진한 주황색 : Aggregate Root
- 애그리거트 루트를 통해 애그리거트 내의 다른 Entity 및 VO 접근
- 애그리거트 하나가 데이터 변경의 단위, 트랜잭션 단위가 되는 연관된 객체의 묶음이다
- 설계 고려 사항
1. 하나의 트랜잭션에는 하나의 애그리거트만 수정
2. 성능 최적화를 위해 애그리거트가 비대해짐을 경계해야 함 → 하나의 일을 잘 수행할 수 있는 작은 애그리거트로 분리해야 함
3. 애그리거트 간 참조는 식별자를 통해서만 참조해야 함 (Product ID VO를 통해 참조)
4. 하나의 트랜잭션에서 여러 애그리거트가 갱신되어야 하는 경우 다른 애그리거트의 갱신은 비동기 통신을 활용하여 결과적 일관성을 맞춰야 함
- BASE 데이터베이스 트랜잭션 Model
- Basically Available, Soft state, Eventually consistent
- ProductOrdered 라는 도메인이벤트가 처리될 때 발생하는 트랜잭션 처리 예시
- 도메인 이벤트
- 비즈니스 도메인에서 일어난 중요한 이벤트를 설명하는 메시지 (과거형)
- 애그리거트는 자신의 도메인 이벤트를 발행
- 도메인 서비스
- 특정 Entity/VO에 속하지 않는 도메인 로직 또는 복수의 애그리거트에 관련된 비즈니스 로직 제공
- 상태가 없는 객체로써 다수의 애그리것이 포함되어야 하는 경우 서비스 객체를 만들어 처리
- Repository
- 도메인 모델의 영속성을 처리
- Factory
- 복잡한 Entity 또는 애그리것 생성을 전담하는 객체 → 주로 프레임워크에서 자체적으로 처리해줌
- 응용서비스
- 도메인 모델에 속하지 않고 응용 계층에서 애그리것을 저장하는 메소드, 애그리것 루트 식별자로 애그리것을 조회하는 메소드를 제공
- 응용서비스가 JPA Repository를 통해 객체를 조회한 후 응용서비스에서 도메인의 비즈니스 로직을 처리하는 방법이다. 보통 트랜잭션 처리할 때 주로 이런 방법을 사용한다
이벤트 소싱 패턴