TL;DR
์ด๋ฒ ๊ธ์ ํต์ฌ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
- aggregate ๋ ๋ฌด์์ธ๊ฐ
- 3๊ฐ์ง ํต์ฌ ๋๋ฉ์ธ ๊ตฌ์ฑ์์ ์ค ๊ฐ์ฅ ๊ธฐ๋ณธ
- entity ์ value ์ composition
- ์์ ํ ํ๋์ ๊ฐ๋
- ์ aggregate ๊ฐ ํ์ํ ๊น
- ๊ณ ์ ์(invariant) ์ ์ผ๊ด์ฑ (consistency) ์ ์งํค๋ ํต์ฌ ๊ฐ์ฒด
- aggregate ์ ํต์ฌ ๊ตฌ์ฑ์์ 3๊ฐ์ง
- entity, root-entity, value
- aggregate ์ ์ค๊ณํ๊ธฐ
- 3๊ฐ์ง ์ค๊ณ ์งํ
- ์ผ๊ด์ฑ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
- actor ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
- usecase ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
- ์ ๋๋์ด์ง aggregate ์ ํน์ฑ
- 3๊ฐ์ง ์ค๊ณ ์งํ
aggregate ๋ ๋ฌด์์ธ๊ฐ
์๋ฆญ ์๋ฐ์ค๊ฐ ์ ์ํ DDD, domain driven design
์์ ํต์ฌ ๋๋ฉ์ธ ๊ตฌ์ฑ์์๋ 3๊ฐ์ง๋ผ๊ณ ๋ถ๋ฅํ๋ค.
- aggregate
- factory
- repository
factory
๋ฅผ ํตํด aggregate
๋ฅผ ์์ฑํ๊ณ repository
๋ฅผ ํตํด aggregate ๋ฅผ ์์ํ๋ค.
์ผ๋ฐ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌํํ ๋ ๋ง์ ํ๋ก์ ํธ์์ Entity ๋ฅผ aggregate ์ ํผ๋ํด์ ์ฌ์ฉํ๋ ๋ชจ์ต์ ๋ณด์๋๋ฐ, DDD ์์๋ ์ด๋ฅผ ์๋ฒฝํ ๊ตฌ๋ถํ๋ค.
์ง๋ ์๊ฐ์ ์ฐ๋ฆฌ๋ entity ์ value ์ ๋ํด์ ์์ ๋ณด์๋๋ฐ ํด๋น ๊ธ์ ํตํด ๋์ฑ ์์ธํ ๋ด์ฉ๋ค์ ํ์ธ ํ ์ ์๋ค
์์ ๋ ๊ธ์์ ์์ธํ ํ์ธํ ์ ์์ง๋ง entity ์ value ์ ์ฐจ์ด๋ฅผ ๊ฐ๋ตํ๊ฒ ์ด์ผ๊ธฐ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์๊ฐ์ ๋ณํ์ ๋ฐ๋ผ entity ๋ ๋ณํ (change) ํ์ง๋ง value ๋ ๋์ฒด (replace) ๋๋ค.
aggregate ๋ ์ด๋ฌํ entity ์ value ๊ฐ์ฒด๋ฅผ composition ์ ํตํ์ฌ ์์ ํ ํ๋์ ๊ฐ๋ ์ผ๋ก ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ์ํํ๋ค.
aggregate ๋ ์์ ํ ํ๋
์ด๋ค.
aggregate ๋ domain entity ์ value ๋ค์ ์งํฉ์ผ๋ก ์ด๋ฃจ์ด์ง ์์ ํ ํ๋์ ๊ฐ๋ ์ด๋ค.
๋ง์ฝ ํ๋์ ํ์๋ฅผ ํ๊ธฐ ์ํด์ ์ฌ๋ฌ aggregate ๋ฅผ ํจ๊ป ์กฐํํด์ผ ํ๋ค๋ฉด ์ด๋ ์์ ํ ํ๋์ ๊ฐ๋ ์ ๋ฒ์ด๋๋ ๊ฒ์ด๋ค.
์ aggregate ๊ฐ ํ์ํ๊ฐ?
aggregate ๊ฐ entity ์ value ๋ฅผ ๋ฌถ์ด๋์ '์์ ํ ํ๋'์ธ ์ด์ ๋ ๋ฐ๋ก 2๊ฐ์ง๊ฐ ์๋ค.
- ๋น์ฆ๋์ค ๊ท์น, ๊ณ ์ ์, invariant
- ์ผ๊ด์ฑ, consistency
์ด 2๊ฐ์ง๋ฅผ ์งํค๊ณ ์ ์งํด์ผํ๋ ์ฑ ์์ด ๋ฐ๋ก aggregate ์๊ฒ ์๋ ๊ฒ์ด๋ค.
1. ๊ณ ์ ์
invariant ๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ณ ์ ์๋ ๋น์ฆ๋์ค ๊ท์น์ ์๋ฏธํ๋ค.
๋น์ฆ๋์ค ๊ท์น์ ์์คํ ์ด ์ด๋ค ์ํฉ์ ๋์ฌ์๋๋ผ๋ ์ ๋ ๋ณํ์ง ์๋ ๋ถ๋ณ์์ด๋ค.
์ฆ, 1 + 2 = 3
์ธ ๊ฒ ์ฒ๋ผ ์ฐ์ ์ฐ์ฐ์ ๋๋ฉ์ธ์์๋ ์์์ด ๊ฐ์ง ์๋ฏธ์ ๋ฑํธ๊ฐ ๊ฐ์ง ์๋ฏธ๋ ์ด๋ ํ ์ํฉ์์๋ ๋ณํ์ง ์์์ผ ํ๋ค.
aggregate ๋ ์ด๋ฌํ ๋น์ฆ๋์ค ๊ท์น์ ์ฝ๋๋ก์ ์ปดํ์ผ๋์ด ์ด๋ ํ ์ํฉ์๋ ๋ณ๊ฒฝ๋์ง ์๋๋ก ํ๋ ์ญํ ์ ์ํํ๋ค.
์ด๋ ๊ฐ๊ฐ์ entity ์ value ๋ค์ด aggregate ๋ด์์ ์ ๊ธฐ์ ์ผ๋ก ํ๋ ฅํ์ฌ ๋ฌ์ฑํ๋ ๊ฒ์ด๋ค.
2. ์ผ๊ด์ฑ
consistency ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ผ๊ด์ฑ๋ ์ญ์ ์์คํ ์ด ์ด๋ ํ ์ํฉ์ ๋์ด๋๋ผ๋ ์ต๋ํ ์ฌ๋ฐ๋ฅธ ์ํ๋ฅผ ๋ณด์ฅํด์ผ ํ๋ค.
์ด๋ฌํ ์ผ๊ด์ฑ์ ๋ณดํต ๊ณ ์ ์ (invariant)์ธ ๋น์ฆ๋์ค ๊ท์น์ ์ํด ์ ์๋๋ฉฐ ๋์ํ๋ค.
aggregate ๋ ๊ณ ์ ์(invariant) ๋ฅผ ํตํด ์ผ๊ด์ฑ(consistency) ์ ๊ฐ๋ฅํ ํญ์ ๋ณด์ฅํด์ผ ํ๋ ์ฑ ์์ด ์๋ค.
DDD ์์๋ ์ด๋ ๊ฒ aggregate ๋ผ๋ ํ๋์ ๋ฌถ์ ๊ฐ๋ ์ ํตํด์ ์ด๋ ํ ๋๋ฉ์ธ ๊ฐ์ฒด์๊ฒ ํฐ ์ญํ ์ ๋ถ์ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ aggregate ๋ฅผ ํตํด ๋น์ฆ๋์ค ๊ท์น์ ์บก์ํ ํ์ฌ ๋ณต์ก์ฑ์ ๋ฎ์ถ๋ ๊ฒ์ด๋ค.
aggregate ์ ํต์ฌ ๊ตฌ์ฑ์์
aggregate ๋ ํฌ๊ฒ 3 ๊ฐ์ง๋ก ์ด๋ฃจ์ด์ง๋ค.
- entity
- root entity
- value
entity ์ root entity
entity ์ ๊ฐ์ฅ ํฐ ํน์ง์ id ๊ฐ ์กด์ฌํ๋ ํ์ง ์๋์ ์๋ค.
์ง๋ entity ์ ์๋ณ์์ ์ด์ผ๊ธฐ ์์ ์ ๋ฆฌํ ๊ธ์ ๋ณด๋ฉด ๋์์ด ๋ ๊ฒ์ด๋ค.
id ๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์, ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋จ์ ์๋ฏธํ๋ค.
๊ฒฐ๊ตญ ์์คํ ์ ํน์ฑ ์์ ์ ํน์ entity ๋ฅผ ์๋ณํ๊ณ ์๋ณ๋ entity ์๊ฒ ์ด๋ ํ ๋ช ๋ น (command) ๋ฅผ ๋ด๋ฆผ์ผ๋ก์จ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
aggregate ๋ด์์ entity ๋ ๋ 2๊ฐ์ง๋ก ๊ตฌ๋ถ๋ ์ ์๋ค.
- ์ ์ญ ์๋ณ์๋ฅผ ๊ฐ์ก๋๋?
- ์ง์ญ ์๋ณ์๋ฅผ ๊ฐ์ก๋๋?
์ ์ญ ์๋ณ์๋ฅผ ๊ฐ์ง entity ๋ ์์คํ ๋ด์์ ์ ์ผํ id ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ global ํ๊ฒ ์๋ณ๋ ์ ์๋ค.
๋ฐ๋ฉด์ ์ง์ญ ์๋ณ์๋ฅผ ๊ฐ์ง entity ๋ ์์คํ ์ด ์๋ aggregate ๋ด์์๋ง ์ง์ญ์ ์ผ๋ก๋ง ์๋ณ๋๋ฉด ๋๋ค.
์ด๋, ์ ์ญ ์๋ณ์๋ฅผ ๊ฐ์ง entity ๊ฐ ๋ฐ๋ก root entity, aggregate root entity
๊ฐ ๋๋ค.
aggregate root entity ์ ์ญํ
aggregate root entity ๋ ์ผ์ข
์ communicator
์ด๋ค.
aggregate ์ธ๋ถ์ ์ธ์์ ์๋ณ์๋ฅผ ๋ ธ์ถํ์ฌ entity ์ value composition ์ ๋ํํ๋ค.
์ธ๋ถ์์๋ aggregate ์ ํน์ entity ์ ์ง์ ์ ๊ทผํ์ง ๋ชปํ๊ณ ํญ์ root entity ๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก๋ง ์ ๊ทผํ ์ ์๋ค.
์ผ์ข ์ ๋ณ๊ฒฝ ์ง์ ์ ํ๋๋ก ๋ชจ์ ๊ฒ์ด๋ผ๊ณ ๋ด๋ ๋ฌด๋ฐฉํ๋ค.
๋ณ๊ฒฝ ์ง์ ์ด ํ๋๋ก ๋ชจ์ด๋ฏ๋ก ๋น์ฆ๋์ค ๊ท์น์ ํ ๊ณณ์์๋ง ์ ์ฉํ ์ ์๊ณ ์ฝ๋๊ฐ ๋์ฑ ๋จ์ํ ๋๋ ๊ฒ์ด๋ค
aggregate ์ ์ค๊ณํ๊ธฐ
aggregate ์ ์ค๊ณํ๋ ์ผ์ ์ ๋ง ์ฝ์ง ์๋ค.
aggregate ๋ฅผ ์ ์ค๊ณํ๋ ๊ฒ์ ์ด๊ธฐ์ ์ด๋ฃจ์ด์ง๊ธฐ ์ด๋ ต๊ณ ์์คํ ์ด ๋ฐ์ ํ ์๋ก ๋ณ๊ฒฝ๋๋๊ฒ aggregate ๋ผ๊ณ ํ๋ค.
aggregate ์ ์ค๊ณํ๋ ๊ฒ์ ์ด๋ ํ ๊ณต์์ด ์กด์ฌํ์ง ์๋๋ค.
ํ์ง๋ง ์ ์ค๊ณํ๊ธฐ ์ํ ์ง์นจ๋ค์ ๋ช๊ฐ์ง ์กด์ฌํ๋ฏ๋ก ํ ๋ฒ ์์๋ณด์.
๋์ผํ ๋น์ฆ๋์ค๋ผ๋ ๊ท์น์ด ์ธ์ธํ๊ฒ ๋ค๋ฅด๊ณ aggregate ๋ฅผ ์ ์ํ๊ธฐ ์ํด ๋ฐ์ํ๋ trade-off ๋ชจ๋ ๋ค๋ฅด์ง๋ง, ์ด๋ฌํ aggregate ๋ฅผ ์ค๊ณํ๋ ๊ธฐ์ค์ ํฌ๊ฒ 3๊ฐ์ง๋ก ๋๋ ์ ๋ฆฌ ํ ์ ์๋ค.
- 1. ์ผ๊ด์ฑ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
- aggregate ๋ consistency ๋ฅผ ๋ณด์ฅํ๋ ๋๋ฉ์ธ ๊ฐ์ฒด
- ์ ๋ง ์ด aggregate ์ ์กด์ฌํ๋ ์์ฑ(๋ฐ์ดํฐ) ๋ค์ด ํ๋์ ์ผ๊ด์ฑ์ ๊ฐ์ ธ์ผ ํ ๊น? ๋ฅผ ๊ณ ๋ฏผํด๋ด์ผ ํจ
- 2. actor ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
- ํ๋์ aggregate ๋ฅผ ์ฌ๋ฌ actor ๊ฐ ์์ ํด์ผ ํ๋ค๋ฉด ์๋ชป๋ aggregate ์ค๊ณ์ผ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํจ
- race condition ์ด ๋ฐ์ํ ์ ์๊ณ
- ex) productItem aggregate ์ ์ฌ๊ณ (stock) ๋ฅผ ํจ๊ป ํฌํจ์ํค๋ฉด ์๋จ
- productItem ์ ์์ ํ๋ seller
- productItem ์ ๊ตฌ๋งคํ๋ customer
- actor ๊ฐ ๋ค๋ฅด๊ธฐ์ ์ด ๋์ ๋๋ ์ผ ํจ
- 3. usecase ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
- ๋จ์ง aggregate ์ ์ฑ ์, ์์ฑ, ๋ฐ์ดํฐ ๋ง์ผ๋ก aggregate ์ ์ค๊ณํ๋ ๊ฒ์ ํ๋ฆ
- usecase ๋ฅผ ๋ถ์ํ๋ค == transaction ์ ๋ถ์ํ๋ค
- ํ transaction ์์ ์ฌ๋ฌ aggregate ๋ฅผ ํญ์ ํจ๊ป ์์ ํ๋ค๋ฉด ๊ทธ aggregate ๋ ํ๋๋ก ๋ฌถ์ฌ์ผ ํ ํ๋ฅ ์ด ๋์
์ด๋ฌํ ๋ช๊ฐ์ง ๊ณ ๋ ค์ฌํญ๋ค์ ๊ธฐ๋ฐ์ผ๋ก ์ ๋๋์ด์ง (์ค๊ณ๋) aggregate ๋ ๋ค์ ํน์ฑ์ ๋๋ค.
- ์ธ์ ๋ ๋จ์ผ ํธ๋์ญ์ ๋ด์์ ์๋ฒฝํ ์ผ๊ด์ฑ์ ์ ์งํ๋ค
- ๋น์ฆ๋์ค์ ์ผ๋ก ์๊ตฌ๋๋ ๋ชจ๋ ๋ฐฉ์๊ณผ ๊ณ ์ ์์ ๋ง์ถฐ ์์ ๋ ์ ์๋ค
- ํ transaction ์์ ์ฌ๋ฌ aggregate ๋ฅผ ์์ ํ์ง ์๋๋ค
'๐ฌweb application > - DDD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DDD] Value Object ์ ๋ํ ์ฌ๋ฌ ์ด์ผ๊ธฐ (0) | 2023.07.23 |
---|---|
[DDD] Entity ์ ์๋ณ์(identifier) ์ ๋ํ ์ฌ๋ฌ ์ด์ผ๊ธฐ (2) | 2023.07.15 |
[DDD] Entity ์ ๋ํ ์ฌ๋ฌ ์ด์ผ๊ธฐ (0) | 2023.07.15 |
Repository Pattern - ์ค์ ํธ (Spring ์์ DIP ๋ฅผ ํตํด Repository ์ ์ ์ธ๊ณผ ๊ตฌํ ๋ถ๋ฆฌ์ํค๊ธฐ) (6) | 2022.08.28 |
[DDD] Repository Pattern ์ด๋, ์ด๋ก ํธ (0) | 2022.08.23 |
๋๊ธ