๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ”ฌapplication/- DDD

DDD ์˜ aggregate ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ

by Wonit 2024. 4. 10.

TL;DR

 

์ด๋ฒˆ ๊ธ€์˜ ํ•ต์‹ฌ์„ ์š”์•ฝํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

  • aggregate ๋ž€ ๋ฌด์—‡์ธ๊ฐ€
    • 3๊ฐ€์ง€ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๊ตฌ์„ฑ์š”์†Œ ์ค‘ ๊ฐ€์žฅ ๊ธฐ๋ณธ
    • entity ์™€ value ์˜ composition
    • ์™„์ „ํ•œ ํ•˜๋‚˜์˜ ๊ฐœ๋…
  • ์™œ aggregate ๊ฐ€ ํ•„์š”ํ• ๊นŒ
    • ๊ณ ์ •์ž(invariant) ์™€ ์ผ๊ด€์„ฑ (consistency) ์„ ์ง€ํ‚ค๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด
  • aggregate ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ 3๊ฐ€์ง€
    • entity, root-entity, value
  • aggregate ์„ ์„ค๊ณ„ํ•˜๊ธฐ
    • 3๊ฐ€์ง€ ์„ค๊ณ„ ์ง€ํ‘œ
      • ์ผ๊ด€์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ
      • actor ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ
      • usecase ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ
    • ์ž˜ ๋‚˜๋‰˜์–ด์ง„ aggregate ์˜ ํŠน์„ฑ

 

aggregate ๋ž€ ๋ฌด์—‡์ธ๊ฐ€

 

์—๋ฆญ ์—๋ฐ˜์Šค๊ฐ€ ์ œ์‹œํ•œ DDD, domain driven design ์—์„œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๊ตฌ์„ฑ์š”์†Œ๋Š” 3๊ฐ€์ง€๋ผ๊ณ  ๋ถ„๋ฅ˜ํ•œ๋‹ค.

 

  1. aggregate
  2. factory
  3. 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๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

  1. ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™, ๊ณ ์ •์ž, invariant
  2. ์ผ๊ด€์„ฑ, consistency

 

์ด 2๊ฐ€์ง€๋ฅผ ์ง€ํ‚ค๊ณ  ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ์ฑ…์ž„์ด ๋ฐ”๋กœ aggregate ์—๊ฒŒ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

1. ๊ณ ์ •์ž

 

invariant ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ณ ์ •์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์˜๋ฏธํ•œ๋‹ค.

 

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ์‹œ์Šคํ…œ์ด ์–ด๋–ค ์ƒํ™ฉ์— ๋†“์—ฌ์žˆ๋”๋ผ๋„ ์ ˆ๋Œ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ถˆ๋ณ€์‹์ด๋‹ค.

 

์ฆ‰, 1 + 2 = 3 ์ธ ๊ฒƒ ์ฒ˜๋Ÿผ ์‚ฐ์ˆ ์—ฐ์‚ฐ์˜ ๋„๋ฉ”์ธ์—์„œ๋Š” ์ˆ˜์‹์ด ๊ฐ€์ง„ ์˜๋ฏธ์™€ ๋“ฑํ˜ธ๊ฐ€ ๊ฐ€์ง„ ์˜๋ฏธ๋Š” ์–ด๋– ํ•œ ์ƒํ™ฉ์—์„œ๋„ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

 

aggregate ๋Š” ์ด๋Ÿฌํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ฝ”๋“œ๋กœ์„œ ์ปดํŒŒ์ผ๋˜์–ด ์–ด๋– ํ•œ ์ƒํ™ฉ์—๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์ด๋Š” ๊ฐ๊ฐ์˜ entity ์™€ value ๋“ค์ด aggregate ๋‚ด์—์„œ ์œ ๊ธฐ์ ์œผ๋กœ ํ˜‘๋ ฅํ•˜์—ฌ ๋‹ฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

2. ์ผ๊ด€์„ฑ

 

consistency ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ผ๊ด€์„ฑ๋„ ์—ญ์‹œ ์‹œ์Šคํ…œ์ด ์–ด๋– ํ•œ ์ƒํ™ฉ์— ๋†“์ด๋”๋ผ๋„ ์ตœ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ƒํƒœ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ผ๊ด€์„ฑ์€ ๋ณดํ†ต ๊ณ ์ •์ž (invariant)์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์— ์˜ํ•ด ์ •์˜๋˜๋ฉฐ ๋™์ž‘ํ•œ๋‹ค.

 

aggregate ๋Š” ๊ณ ์ •์ž(invariant) ๋ฅผ ํ†ตํ•ด ์ผ๊ด€์„ฑ(consistency) ์„ ๊ฐ€๋Šฅํ•œ ํ•ญ์ƒ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ์ฑ…์ž„์ด ์žˆ๋‹ค.

 

DDD ์—์„œ๋Š” ์ด๋ ‡๊ฒŒ aggregate ๋ผ๋Š” ํ•˜๋‚˜์˜ ๋ฌถ์Œ ๊ฐœ๋…์„ ํ†ตํ•ด์„œ ์–ด๋– ํ•œ ๋„๋ฉ”์ธ ๊ฐ์ฒด์—๊ฒŒ ํฐ ์—ญํ• ์„ ๋ถ€์—ฌํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  aggregate ๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์บก์Šํ™” ํ•˜์—ฌ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด๋‹ค.

 

aggregate ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ

 

aggregate ๋Š” ํฌ๊ฒŒ 3 ๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

  1. entity
  2. root entity
  3. value

 

entity ์™€ root entity

 

entity ์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ id ๊ฐ€ ์กด์žฌํ•˜๋ƒ ํ•˜์ง€ ์•Š๋ƒ์— ์žˆ๋‹ค.

 

์ง€๋‚œ entity ์™€ ์‹๋ณ„์ž์˜ ์ด์•ผ๊ธฐ ์—์„œ ์ •๋ฆฌํ•œ ๊ธ€์„ ๋ณด๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.

 

id ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์€, ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋จ์„ ์˜๋ฏธํ•œ๋‹ค.

 

๊ฒฐ๊ตญ ์‹œ์Šคํ…œ์€ ํŠน์„ฑ ์‹œ์ ์— ํŠน์ • entity ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์‹๋ณ„๋œ entity ์—๊ฒŒ ์–ด๋– ํ•œ ๋ช…๋ น (command) ๋ฅผ ๋‚ด๋ฆผ์œผ๋กœ์จ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

aggregate ๋‚ด์—์„œ entity ๋Š” ๋˜ 2๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋  ์ˆ˜ ์žˆ๋‹ค.

 

  1. ์ „์—ญ ์‹๋ณ„์ž๋ฅผ ๊ฐ€์กŒ๋Š๋ƒ?
  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 ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค

๋Œ“๊ธ€