DDD, Aggregate (애그리거트)

Aggregate 의미와 설계

Chanhyeong LEE
3 min readMay 12, 2020

Aggregate 란?

하나의 단위로 생각할 수 있는 객체들의 군집이다. Root Entity 와 다른 여러 Entity, Value Object 를 포함한다. 일반적으로 비지니스 Entity 들이 Aggregate 다. 예를 들면, Customer, Account, Order, Product 이다.

Order Aggregate

Aggregate: rule #1

다른 Aggregate 의 Root Entity 를 참조할 때는 Identity (Primary Key) 로 참조하라. 위 클래스 다이어그램을 보면 Order 클래스가 customer 를 직접 가지는 것이 아닌 customerId 를 가지는 것, OrderLineItem 에 product 를 직접 가지는 것이 아닌productId 를 가지는 것처럼 말이다. 이는 Domain Model 에 Foreign key 를 갖게 하는 것이고 OOP 에 위배된다. 하지만 이를 통해 얻는 효과는 각 Aggregate 간에 약한 connection 을 가지게 되고 쉽게 각 Aggregate 를 마이크로서비스로 만들 수 있다.

  • Order service
  • Customer service
  • Product service

Aggregate: rule #2

한 트랜잭션에서는 하나의 Aggregate 만 변경한다. Aggregate 는 일종의 일관성 (consistency)를 유지하는 하나의 단위이며 하나의 서비스의 경계다. 이 때 한 트랜잭션에 하나의 Aggregate 만 변경함으로 그 경계를 지킬 수 있다. 이렇게 했을 때 마이크로서비스로 나눌 수 있다.

Aggregate: rule #3

작은 단위로 Aggregate 를 디자인한다. 큰 단위로 Aggregate 를 작성하면 Aggregate 내 Consistency 를 쉽게 유지할 수 있으나, Scalability 와 User experience 에 좋지 않은 영향을 준다. 예를 들면, Post가 Root Entity 이고 Comment Entity 를 N 개 가지고 있다.

이 때, 여러 유저가 동시에 한 Post 에 Comment 들을 삭제할 수 없다. 한 Aggregate 변경이 트랜잭션 단위며 한 유저가 Comment 를 변경하고 있을 때, 다른 유저는 Comment 를 변경할 수 없다. Comment A, Comment B 를 가진 Post 를 유저 A 가 Comment A 를 삭제 요청, 유저 B 가 Comment B 삭제 요청을 동시에 하고 서버가 2대 있어서 각각 하나씩 요청을 받았을 때, 한 대 에서는 Post 에서 Comment A 를 삭제하고 Comment B 만 있는 Post 를 저장하려고 할테고, 다른 서버에서는 Post 에서 Comment B 를 삭제하고 Comment A 만 있는 Post 를 저장하려 할 것이다. 그래서 Post 와 Comment 는 서로 다른 Aggregate 로 분리해야한다.

그렇게 하면 Comment A, Comment B 제거 요청을 동시에 가능하다.

--

--