Skip to content

Commit

Permalink
3.3.2.2. 다른 애그리거트 참조
Browse files Browse the repository at this point in the history
  • Loading branch information
assu10 committed Jan 4, 2025
1 parent 25e11a7 commit 410c0c7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
22 changes: 21 additions & 1 deletion _posts/2024-04-06-ddd-aggregate.md
Original file line number Diff line number Diff line change
Expand Up @@ -581,12 +581,14 @@ JPA 는 `@ManyToOne`, `@OneToOne` 등의 애너테이션을 이용하여 연관

> 애그리거트 간 참조를 필드가 아닌 ID 를 통해 참조하는 것이 좋으므로 아래 내용은 참고만 할 것

필드를 이용하여 애그리거트 참조를 쉽게 구현 가능하지만, **필드를 이용한 애그리거트 참조는 아래와 같은 문제점을 야기**할 수 있다.
필드를 이용하여 애그리거트 참조를 쉽게 구현 가능하지만, **필드를 이용한 애그리거트 참조(=애그리거트 내의 모든 객체는 같은 트랜잭션 경계를 공유하므로 애그리거트가 너무 커지면)는 아래와 같은 문제점을 야기**할 수 있다.

- 편한 참조의 오용
- 성능에 대한 고민
- 확장의 어려움

애그리거트는 가능한 작게 유지하고, 비즈니스 로직에 따라 강력하게 일관적으로 상태를 유지할 필요가 있는 객체만 포함한다.

---

### 4.1.1. 편한 참조의 오용
Expand Down Expand Up @@ -651,6 +653,7 @@ ID 참조를 사용하면 모든 객체가 참조로 연결되는 것이 아니

따라서 **애그리거트의 경계를 명확**히 하고, **애그리거트 간 물리적인 연결을 제거하기 때문에 모델의 복잡도를 낮춰**준다.
**애그리거트 간 의존를 제거하므로 응집도를 높여**주고, **구현 복잡도도 낮아**진다.
또한 **각 애그리거트가 자신의 트랜잭션 경계를 갖도록 보장**할 수 있다.

**다른 애그리거트를 직접 참조하지 않으므로 애그리거트 간 참조를 지연 로딩으로 할지 즉시 로딩으로 할지 고민하지 않아도 된다.**
참조하는 애그리거트가 필요하면 응용 서비스에서 ID 를 이용하여 로딩하면 된다.
Expand Down Expand Up @@ -685,6 +688,23 @@ public class ChangeOrderService {

---

[1. 도메인 모델](https://assu10.github.io/dev/2024/08/31/ddd-domain-model-pattern/) 의 예시를 보자.

```java
public class Ticket {
private UserId customerId;
private List<ProductrId> products;
private UserId assignedAgentId;
private List<Message> messages;
}
```

'에이전트가 상부 보고된 티켓의 응답 제한 시간의 절반이 지나기 전에 티켓을 열람하지 않으면 자동으로 다른 에이전트가 할당됨' 을 보자.
만일 어느 정도 지연이 된 후 티켓을 열람했다는 알림을 받는다면 상당수의 티켓이 불필요하게 재할당될 것이므로 시스템의 상태가 손상된다.
따라서 위 코드에서 메시지의 데이터는 애그리거트의 경계에 속하므로 필드 참조로 구성하였고, 그 외 나머지는 ID 참조를 하고 있다.

---

### 4.2.1. ID 를 이용한 참조와 조회 성능: `N+1 조회 문제`

**다른 애그리거트를 ID 로 참조하면 참조하는 여러 애그리거트를 읽을 때 조회 속도에 문제**가 될 수도 있다.
Expand Down
6 changes: 5 additions & 1 deletion _posts/2024-08-31-ddd-domain-model-pattern.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ CURD 인터페이스 대신 복잡한 상태 전환이나 항상 보호해야
- 에이전트는 티켓의 우선 순위에 따른 응답 제한 시간(SLA, Service Level Agreement) 내에 해법을 제시해야 함
- 할당된 에이전트가 응답 제한 시간 내에 응답 제한 시간 내에 응답하지 못하면, 고갯은 티켓을 에이전트의 상위 관리자에게 보고할 수 있음
- 티켓이 상위 관리자에게 보고되면 에이전트의 응답 제한 시간이 33% 줄어듬
- 에이전트가 상부 보고된 티켓의 응답 제한 시간의 절반이 지나기 전에 티켓으 열람하지 않으면 자동으로 다른 에이전트가 할당됨
- 에이전트가 상부 보고된 티켓의 응답 제한 시간의 절반이 지나기 전에 티켓을 열람하지 않으면 자동으로 다른 에이전트가 할당됨
- 할당된 에이전트의 질문에 고객이 7일 이내에 응답하지 않으면 티켓은 자동으로 닫힘
- 상부 보고된 티켓은 자동 혹은 할당된 에이전트에 의해 닫힐 수 없고, 고객 또는 에이전트의 매니저만 닫을 수 있음
- 고객은 티켓이 닫힌 지 7일 이내에 닫힌 티켓을 다시 열 수 있음
Expand Down Expand Up @@ -127,10 +127,14 @@ DDD 의 전술 패턴인 애그리거트, 밸류 오브젝트, 도메인 이벤

#### 3.3.2.1. 엔티티 계층

> [4.2. 애그리거트 (Aggregate)](https://assu10.github.io/dev/2024/04/01/ddd-architecture/#42-%EC%95%A0%EA%B7%B8%EB%A6%AC%EA%B1%B0%ED%8A%B8-aggregate) 를 참고하세요.
---

#### 3.3.2.2. 다른 애그리거트 참조

> [4. 애그리거트 참조](https://assu10.github.io/dev/2024/04/06/ddd-aggregate/#4-%EC%95%A0%EA%B7%B8%EB%A6%AC%EA%B1%B0%ED%8A%B8-%EC%B0%B8%EC%A1%B0) 를 참고하세요.
---

#### 3.3.2.3. 애그리거트 루트
Expand Down

0 comments on commit 410c0c7

Please sign in to comment.