[๐Ÿ’ก DDD - ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„]

yongcraneยท2025๋…„ 3์›” 22์ผ

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(Domain-Driven Desing)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์ ‘๊ทผ๋ฒ•์œผ๋กœ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ˜‘๋ ฅํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๋ชจ๋ธ์„ ๋„๋ฉ”์ธ์— ์ง‘์ค‘ํ•˜๋„๋ก ์„ค๊ณ„ ๊ธฐ๋ฒ•์ด๋‹ค.

DDD์˜ ํ•ต์‹ฌ์€ ๋„๋ฉ”์ธ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„์™€ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•จ์œผ๋กœ์จ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค.

DDD์˜ ์ฃผ์š” ๊ฐœ๋…

๋„๋ฉ”์ธ:

์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋ฌธ์ œ ์˜์—ญ.
์˜ˆ: ์ „์ž ์ƒ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ์˜ ๋„๋ฉ”์ธ์€ "์ƒํ’ˆ ์ฃผ๋ฌธ๊ณผ ๊ฒฐ์ œ"์ž…๋‹ˆ๋‹ค.

์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด(Ubiquitous Language):

ํŒ€์›(๋น„์ฆˆ๋‹ˆ์Šค ์ „๋ฌธ๊ฐ€, ๊ฐœ๋ฐœ์ž)์ด ๊ณต์œ ํ•˜๋Š” ๊ณตํ†ต์˜ ์–ธ์–ด.
๋„๋ฉ”์ธ์˜ ๊ฐœ๋…๊ณผ ์šฉ์–ด๋ฅผ ์ผ์น˜์‹œ์ผœ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ(Bounded Context):

๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜๋˜๊ณ  ์ ์šฉ๋˜๋Š” ๊ฒฝ๊ณ„.
์˜ˆ: "์ฃผ๋ฌธ"๊ณผ "๊ฒฐ์ œ"๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ ๋ชจ๋ธ(Domain Model):

๋„๋ฉ”์ธ์„ ์ถ”์ƒํ™”ํ•œ ์„ค๊ณ„ ๋ชจ๋ธ๋กœ, ๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ(Aggregate):

๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ฌถ์ธ ์—”ํ‹ฐํ‹ฐ(Entity)์™€ ๊ฐ’ ๊ฐ์ฒด(Value Object)์˜ ์ง‘ํ•ฉ์œผ๋กœ, ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

DDD์˜ ์‹ค์šฉ์ ์ธ ์ ์šฉ ๋‹จ๊ณ„

๋„๋ฉ”์ธ ์ดํ•ด:

๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์™€์˜ ํ˜‘์—…์„ ํ†ตํ•ด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ: ๊ณ ๊ฐ, ์ฃผ๋ฌธ, ๊ฒฐ์ œ์™€ ๊ฐ™์€ ์ฃผ์š” ๊ฐœ๋…์„ ๋„์ถœ.

์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด ์ •์˜:

ํŒ€ ๊ฐ„์— ์ผ๊ด€๋œ ์šฉ์–ด๋ฅผ ์ •์˜ํ•˜์—ฌ ๋„๋ฉ”์ธ ์–ธ์–ด๋กœ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ ๊ตฌ๋ถ„:

๋„๋ฉ”์ธ ์ „์ฒด๋ฅผ ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ๊ฐ ์ปจํ…์ŠคํŠธ์˜ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•˜๊ณ  ๋…๋ฆฝ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ: "๋ฐฐ์†ก ๊ด€๋ฆฌ"์™€ "์ƒํ’ˆ ์นดํƒˆ๋กœ๊ทธ"๋ฅผ ๋ณ„๋„ ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ฆฌ.

๋„๋ฉ”์ธ ๋ชจ๋ธ ์„ค๊ณ„:

์—”ํ‹ฐํ‹ฐ(Entity), ๊ฐ’ ๊ฐ์ฒด(Value Object), ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ(Aggregate)๋ฅผ ์ •์˜ํ•˜์—ฌ ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ: "Order"๋Š” ์ฃผ๋ฌธ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋กœ ์„ค๊ณ„.

DDD์˜ ์žฅ์ ๊ณผ ํ•œ๊ณ„

์žฅ์ :

  • ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ˜์˜: ๋„๋ฉ”์ธ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ์„ค๊ณ„์— ๋ฐ˜์˜.
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ: ํŒ€์˜ ๊ณตํ†ต๋œ ์–ธ์–ด์™€ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ.
  • ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ: ์ปจํ…์ŠคํŠธ ๋ถ„๋ฆฌ๋กœ ์˜์กด์„ฑ์„ ์ค„์ด๊ณ  ๊ด€๋ฆฌ ์šฉ์ด.

ํ•œ๊ณ„:

  • ๋ณต์žกํ•œ ์ดˆ๊ธฐ ์„ค๊ณ„: ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜์— ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Œ.
  • ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€ ์˜์กด: ๋„๋ฉ”์ธ ์ดํ•ด ๋ถ€์กฑ ์‹œ ์„ค๊ณ„ ํ’ˆ์งˆ ์ €ํ•˜.

๊ฒฐ๋ก 

DDD๋Š” ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ค๋ฃจ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์— ๋งค์šฐ ์œ ์šฉํ•œ ์ ‘๊ทผ๋ฒ•์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์žฅ๊ธฐ์ ์ธ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ˜์˜์— ํƒ์›”ํ•œ ๊ฐ•์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ DDD๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉํ•˜๋ ค๋ฉด ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์™€์˜ ๊ธด๋ฐ€ํ•œ ํ˜‘์—…๊ณผ ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„์„ ํˆฌ์žํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ
msa ๋ชจ๋ธ๋ง: ๏ปฟengineering-skcc.github.io/microservice%20modeling/Event-Storming/

๋งํฌ: ๏ปฟwww.msaez.io/#/

profile
์งง๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ!

0๊ฐœ์˜ ๋Œ“๊ธ€