nika-blog

๐Ÿš€ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD) ๊ทธ ํ›„ - ํ˜„์žฌ์˜ DDD๋Š” ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ–ˆ๋Š”๊ฐ€? ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

๐Ÿš€ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD) ๊ทธ ํ›„ - ํ˜„์žฌ์˜ DDD๋Š” ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ–ˆ๋Š”๊ฐ€?

nika0 2025. 2. 23. 14:22

๐Ÿ“Œ ๊ณผ๊ฑฐ์˜ DDD vs ํ˜„์žฌ์˜ DDD

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

๐Ÿ“Œ ํ˜„์žฌ์˜ DDD๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ํŒจํ„ด์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
1๏ธโƒฃ ์ „๋žต์  ํŒจํ„ด (Strategic Patterns)๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ ๊ณต๊ฐ„(Problem Space)์—์„œ ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ณผ์ •
2๏ธโƒฃ ์ „์ˆ ์  ํŒจํ„ด (Tactical Patterns)์†”๋ฃจ์…˜ ๊ณต๊ฐ„(Solution Space)์—์„œ ๋„๋ฉ”์ธ์„ ์ฝ”๋“œ๋กœ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ’ก ์ฆ‰, ๋ฌธ์ œ๋ฅผ ์ด์ƒ์ ์œผ๋กœ ๋‚˜๋ˆ„๊ณ (๋””์Šคํ‹ธ๋ ˆ์ด์…˜), ์‹ค์ œ ๊ตฌํ˜„์—์„œ ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ๊ฒƒ์ธ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ๊ณผ์ •์ด ํฌํ•จ๋จ.


๐Ÿ”น ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ์™€ ๋””์Šคํ‹ธ๋ ˆ์ด์…˜

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

  • ์†”๋ฃจ์…˜ ๊ณต๊ฐ„(Solution Space)์—์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ํ˜„์‹ค์ ์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•
  • ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ๋ชจ๋“  ์ƒํ™ฉ์— ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํŒ€๋ณ„๋กœ ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚˜๋ˆ„์–ด ์šด์˜

๐Ÿ“Œ ๋””์Šคํ‹ธ๋ ˆ์ด์…˜ (Distillation)

  • ๋ฌธ์ œ ๊ณต๊ฐ„(Problem Space)์—์„œ ํ•ต์‹ฌ ๋„๋ฉ”์ธ๊ณผ ํ•˜์œ„ ๋„๋ฉ”์ธ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณผ์ •
  • ๋น„์ฆˆ๋‹ˆ์Šค์ ์œผ๋กœ ํ•ต์‹ฌ์ ์ธ ๋„๋ฉ”์ธ(์ฝ”์–ด ๋„๋ฉ”์ธ)๊ณผ ์ง€์› ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌ

๐Ÿ’ก ์ด ๋‘ ๊ฐœ๋…์„ ํ™œ์šฉํ•˜๋ฉด, ๋ถˆํ•„์š”ํ•œ ๋„๋ฉ”์ธ ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ณ  ์ค‘์š”ํ•œ ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ.


๐Ÿ”จ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ ๊ตฌํ˜„ - ๋ฐ˜ ๋ฒ„๋…ผ(Vaughn Vernon)์˜ ์ •๋ฆฌ

๐Ÿ“– ๋ฐ˜ ๋ฒ„๋…ผ์˜ "Implementing Domain-Driven Design"์—์„œ ํ˜„์žฌ์˜ DDD ์ฒด๊ณ„ ์ •๋ฆฝ

  • ์ „์ˆ ์  ํŒจํ„ด๊ณผ ์ „๋žต์  ํŒจํ„ด ๊ฐœ๋…์„ ํ™•๋ฆฝ
  • ๋ฌธ์ œ ๊ณต๊ฐ„(Problem Space)๊ณผ ์†”๋ฃจ์…˜ ๊ณต๊ฐ„(Solution Space) ๊ฐœ๋…์„ ๋„์ž…
  • ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌํ˜„์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ์ œ๊ณต

๐Ÿ”— DDD์™€ ์•„ํ‚คํ…์ฒ˜ - ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ๋ฐ ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ

๐Ÿ“Œ ํŠธ๋žœ์žญ์…˜ ๋‹น ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ

  • ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด ์—ฌ๋Ÿฌ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋„๋ก ์ œํ•œ
  • ์˜ˆ์ œ:
    • Order(OrderLineItem)๊ณผ Customer๊ฐ€ ๋ณ„๋„์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ง
    • ์ฃผ๋ฌธ ์ˆ˜(Order Count)๋Š” ๊ณ ๊ฐ(Customer) ์—”ํ‹ฐํ‹ฐ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ

๐Ÿ“Œ ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ (Domain Event) - Eric Evans

  • ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ๋ฐœ์ƒํ•œ ์ค‘์š”ํ•œ ์‚ฌ๊ฑด์„ ๊ธฐ๋กํ•˜๋Š” ๊ฐœ๋…
  • DB ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ง์ ‘ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ์™€ ๋™๊ธฐํ™”
  • ์ฃผ๋ฌธ ์ƒ์„ฑ(Order Created), ๊ฒฐ์ œ ์™„๋ฃŒ(Payment Processed) ๋“ฑ์˜ ์ด๋ฒคํŠธ ํ™œ์šฉ

๐Ÿ”„ ์ด๋ฒคํŠธ ์†Œ์‹ฑ (Event Sourcing)

๐Ÿ“Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)์— ์ตœ์ข… ์ƒํƒœ๋งŒ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋ชจ๋‘ ๊ธฐ๋กํ•˜๋Š” ๋ฐฉ์‹

๐Ÿ’ก ์ผ๋ฐ˜์ ์ธ DB๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋จ.

scss
๋ณต์‚ฌํŽธ์ง‘
1246 (์ตœ์ข… ์ƒํƒœ: 6๋งŒ ์ €์žฅ)

๐Ÿ“Œ ํ•˜์ง€๋งŒ, ๋ณ€ํ™” ๊ณผ์ •์„ ์ถ”์ ํ•˜๋ ค๋ฉด?

  • ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ €์žฅ
  • DB๊ฐ€ ์•„๋‹ˆ๋ผ **์ด๋ฒคํŠธ ์Šคํ† ์–ด(Event Store)**์— ์ €์žฅ
  • ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ์žฌ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—†์ด๋„ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
  • ์‹ค๋ฌด์—์„œ๋Š” ์„ฑ๋Šฅ ์ด์Šˆ๋กœ ์™„์ „ํžˆ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์›€

โœ… ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ด ๋“ฑ์žฅํ•œ ์ด์œ ?

  • ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ์™€ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ๋ณด๋‹ค ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด
  • ๋น„์ฆˆ๋‹ˆ์Šค ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›

โš– CQRS - ๋ณต์žก์„ฑ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋ถ„๋ฆฌ

๐Ÿ’ก ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ๊ฐ€ ์ฑ…์ž„์ด ๊ณผ๋„ํ•ด์ง€๋ฉด?

  • ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ๋Š” ์ˆ˜์ •(Write) ๋ฒ”์œ„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐœ๋…์ด์ง€, ์กฐํšŒ(Read) ๊ธฐ๋Šฅ๊นŒ์ง€ ํฌํ•จํ•˜๋Š” ๊ฒƒ์€ ์ ์ ˆํ•˜์ง€ ์•Š์Œ
  • UI์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์กฐํšŒ(์ฟผ๋ฆฌ)๊นŒ์ง€ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ๊ฐ€ ๋‹ด๋‹นํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€

๐Ÿ“Œ CQRS(Command Query Responsibility Segregation)๋ž€?

  • ์กฐํšŒ ๋ชจ๋ธ(Query Model)๊ณผ ๋ณ€๊ฒฝ ๋ชจ๋ธ(Command Model)์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ๊ธฐ(Read)๋Š” ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ ๋ฐฉ์‹์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ œ๊ณต
  • ์“ฐ๊ธฐ(Write)๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ํ†ตํ•ด ์ฒ ์ €ํ•˜๊ฒŒ ๊ฒ€์ฆ

๐Ÿ“Œ CQRS ํ™œ์šฉ ์˜ˆ์ œ

  • ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐฉ๋Œ€ํ•  ๊ฒฝ์šฐ, ์ง์ ‘ JOINํ•ด์„œ ์กฐํšŒํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  Kafka ๋“ฑ์˜ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ „์†ก
    • ๋น ๋ฅธ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ ์บ์‹œ(Cache) ๋˜๋Š” ๊ฒ€์ƒ‰ ์ธ๋ฑ์Šค ํ™œ์šฉ

โœ… ๊ฒฐ๊ณผ์ ์œผ๋กœ, CQRS๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ๋„ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Œ.


๐Ÿš€ DDD์™€ MSA (Microservices Architecture)์˜ ์—ฐ๊ฒฐ

๐Ÿ’ก DDD๋Š” MSA(๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜)์™€ ํ•จ๊ป˜ ์„ฑ์žฅํ–ˆ๋‹ค!

  • 2012๋…„ ์ดํ›„ MSA๊ฐ€ ์œ ํ–‰ํ•˜๋ฉด์„œ, ์ž‘์€ ์„œ๋น„์Šค๋“ค์˜ ๊ฒฐํ•ฉ์ด ํ•˜๋‚˜์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™”
  • ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ ๊ฐœ๋…์ด MSA์—์„œ ํ•ต์‹ฌ ๊ฐœ๋…์œผ๋กœ ํ™œ์šฉ๋จ
  • ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์„œ๋น„์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜

โœ… DDD๋Š” MSA์™€ ํ•จ๊ป˜ ์‹œ์Šคํ…œ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ์ž๋ฆฌ ์žก์Œ!


๐Ÿ— ํ•ต์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜(Hexagonal Architecture)์˜ ์žฌ์กฐ๋ช…

๐Ÿ“– 2005๋…„ ๋“ฑ์žฅํ•œ "Hexagonal Architecture"

  • ํ•ต์‹ฌ ๊ฐœ๋…: UI๋‚˜ DB์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋…๋ฆฝ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
  • ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•˜๊ณ , ๋ณ€๊ฒฝ์ด ์œ ์—ฐํ•จ
  • ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ "ํ•ต์‹ฌ(Core)"์œผ๋กœ ๋‘๊ณ ,
    ์ž…์ถœ๋ ฅ(Ports)๊ณผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ(Adapters)์„ ๋ณ„๋„๋กœ ๋ถ„๋ฆฌ

๐Ÿ’ก ํ•˜์ง€๋งŒ DDD๋ฅผ ํ•œ๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด Hexagonal Architecture๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Œ!

  • ๋‘˜์€ ๋…๋ฆฝ์ ์ธ ๊ฐœ๋…์ด๋ฉฐ,
  • ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•จ.

๐Ÿ† ๊ฒฐ๋ก : ํ˜„์žฌ์˜ DDD๋Š”?

โœ… ๊ณผ๊ฑฐ์˜ ์ด๋ก ์  ๊ฐœ๋…์—์„œ ๋ฒ—์–ด๋‚˜, ์‹ค์šฉ์ ์ธ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ๋ฐœ์ „
โœ… ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ์™€ ๋””์Šคํ‹ธ๋ ˆ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ
โœ… ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ์™€ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๊ณ , ์•ˆ์ •์„ฑ์„ ๋ณด์žฅ
โœ… CQRS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ , ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”
โœ… MSA ๋ฐ ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋”์šฑ ์‹ค์šฉ์ ์ธ ๊ฐœ๋…์œผ๋กœ ์ž๋ฆฌ ์žก์Œ

๐Ÿ’ก ๊ณผ๊ฑฐ์—๋Š” "์ด๋ก ์ ์ธ ์ฒ ํ•™"์— ๊ฐ€๊นŒ์› ๋˜ DDD๊ฐ€, ์ด์ œ๋Š” ํ˜„์‹ค์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค๋ฌด ์ง€์นจ์œผ๋กœ ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿš€