nika-blog

๐Ÿ— ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD) - ํŒŒํŠธ4 ์ „๋žต์  ์„ค๊ณ„ ๋ณธ๋ฌธ

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

๐Ÿ— ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD) - ํŒŒํŠธ4 ์ „๋žต์  ์„ค๊ณ„

nika0 2025. 2. 23. 14:21

๐ŸŽฏ ๊ฐœ๋ฐœ๊ณผ ์ •์น˜๊ฐ€ ๋งŒ๋‚˜๋Š” ๊ณณ: ์ „๋žต์  ์„ค๊ณ„

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์•„๋‹ˆ๋ผ ์กฐ์ง์˜ ๊ตฌ์กฐ, ํ˜‘์—… ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ์™€๋„ ๋งž๋ฌผ๋ ค ์žˆ๋Š” ์ „๋žต์ ์ธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
ํŠนํžˆ, ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์ „์‚ฌ(๊ธฐ์—… ์ „์ฒด)์— ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋งŒ ์กด์žฌํ•ด์•ผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค!

  • ํŒ€๋งˆ๋‹ค ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
  • ๋ชจ๋“  ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์ค‘์š”ํ•œ ๊ณณ์— ์ง‘์ค‘ํ•ด์•ผ ํ•จ

โŒ ์‹ค๋ฌด์—์„œ ๋งˆ์ฃผํ•˜๋Š” ๋ฌธ์ œ๋“ค

์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ฑ์žฅํ•˜๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์€ ์ฝ”๋“œ

  • ์—ฌ๋Ÿฌ ํŒ€์ด ํ•จ๊ป˜ ์ˆ˜์ •ํ•˜๋‹ค ๋ณด๋ฉด ํ•œ ๊ธฐ๋Šฅ์ด ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์— ๊ฑธ์ณ ์ค‘๋ณต
  • ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง

๐Ÿ”น ๊ธฐ๋Šฅ ์ถ”๊ฐ€ & ์ฝ”๋“œ ์ˆ˜์ • ์‹œ ์ถฉ๋Œ

  • ๋‹จ์ผ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ˆ˜์ • ์‹œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๋ฐœ์ƒ
  • ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ํŒ€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

๐Ÿ”น ํ˜‘์—… ์˜ค๋ฒ„ํ—ค๋“œ ์ฆ๊ฐ€

  • ์„œ๋กœ ๋‹ค๋ฅธ ํŒ€์ด ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ž‘์—…ํ•  ๊ฒฝ์šฐ, ๋ฆด๋ฆฌ์ฆˆ ์ผ์ • ์กฐ์œจ ํ•„์š”
  • ๋‹ค๋ฅธ ํŒ€์˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ๋‚˜์—๊ฒŒ๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ

๐Ÿ“Œ ์˜ˆ์ œ: ์ฃผ๋ฌธ ๋„๋ฉ”์ธ๊ณผ ํšŒ์› ๋„๋ฉ”์ธ ์ถฉ๋Œ

  • ํšŒ์› ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ์—์„œ ๋ฒ„๊ทธ ๋ฐœ์ƒ
  • ์ฃผ๋ฌธ ํŒ€๊ณผ ํšŒ์› ํŒ€์ด ์กฐ์œจํ•ด์•ผ ํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ํ˜‘์—… ์ฆ๊ฐ€

๐Ÿ’ก โžก ํ•ด๊ฒฐ์ฑ…: ์ฝ”๋“œ ๋ถ„๋ฆฌ & ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ(Bounded Context) ์ ์šฉ


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

๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋ž€?
๐Ÿ“Œ ํŠน์ •ํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ ์šฉ๋˜๋Š” ๋ฒ”์œ„

๐Ÿ”น ์™œ ํ•„์š”ํ• ๊นŒ?

  • ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ํ˜‘์—… ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ฆ๊ฐ€
  • ๋”ฐ๋ผ์„œ, ๊ฐ ํŒ€์ด ๋…๋ฆฝ์ ์ธ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๊ฐ€์ ธ์•ผ ํ•จ
  • ๊ฐ™์€ ๊ฐœ๋…์ด๋ผ๋„ ๊ฐ ์ปจํ…์ŠคํŠธ๋งˆ๋‹ค ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

๐Ÿ”น ์˜ˆ์ œ: ์ „์ž์ƒ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ

1๏ธโƒฃ ํŒ๋งค ์ปจํ…์ŠคํŠธ์˜ ์ƒํ’ˆ(Product)

  • ํŒ๋งค์ž๋Š” ์ƒํ’ˆ์„ ๋“ฑ๋กํ•˜๋ฉฐ, ์ƒํ’ˆ ์ •๋ณด๊ฐ€ ๋งˆ์ผ€ํŒ…์— ์ตœ์ ํ™”๋จ
    2๏ธโƒฃ ๋ฐฐ์†ก ์ปจํ…์ŠคํŠธ์˜ ์ƒํ’ˆ(Product)
  • ๋ฐฐ์†กํŒ€์€ ์ƒํ’ˆ์„ ํŒจํ‚ค์ง•ํ•˜๊ณ , ๋ฌผ๋ฅ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ

โœ… ๊ฐ™์€ "์ƒํ’ˆ"์ด๋ผ๋„, ํŒ๋งค ์ปจํ…์ŠคํŠธ์™€ ๋ฐฐ์†ก ์ปจํ…์ŠคํŠธ์—์„œ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„๋  ์ˆ˜ ์žˆ์Œ!
๊ฐ ์ปจํ…์ŠคํŠธ๋ณ„๋กœ ๋ณ„๋„์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

๐Ÿ’ก Best Practice

  • DB๊นŒ์ง€ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ด์ƒ์ 
  • MSA(Microservices Architecture)์—์„œ๋„ ๋งŽ์ด ์‚ฌ์šฉ๋จ

๐Ÿ”— ์ปจํ…์ŠคํŠธ ๋งต (Context Map)

๐Ÿ“Œ ์ปจํ…์ŠคํŠธ ์‚ฌ์ด์˜ ๊ด€๊ณ„์™€ ๋ชจ๋ธ ๋ณ€ํ™˜ ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ์ง€๋„

๐Ÿ”น ์ปจํ…์ŠคํŠธ ๋งต์ด ํ•„์š”ํ•œ ์ด์œ 

  • ํŒ€ ๊ฐ„ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด
  • ๋‹ค๋ฅธ ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ณ€ํ™˜ ๋ฐฉ์‹ ์ •์˜

๐Ÿ”น ์˜ˆ์ œ

  • ํŒ๋งค ์ปจํ…์ŠคํŠธ์—์„œ "์ƒํ’ˆ" ๋ฐ์ดํ„ฐ → ๋ฐฐ์†ก ์ปจํ…์ŠคํŠธ์˜ "์ƒํ’ˆ" ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜
  • ๊ฐ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉด์„œ๋„ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ณต์œ ํ•˜๋„๋ก ์„ค๊ณ„

๐Ÿ”น ์กฐ์ง ๊ตฌ์กฐ์™€์˜ ๊ด€๊ณ„

๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์กฐ์ง ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ๋ฐฉ์‹๊ณผ๋„ ์—ฐ๊ฒฐ๋จ

  • ๊ฐ ์ปจํ…์ŠคํŠธ๋Š” ํŒ€ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ
  • ํŒ€ ๊ฐ„ ํ˜‘์—… ๋ฐฉ์‹ ์ •๋ฆฌ ํ•„์š”

โœ… ์ปจํ…์ŠคํŠธ ๊ฐ„ ํ˜‘์—… ๋ฐฉ์‹ 3๊ฐ€์ง€ 1๏ธโƒฃ ์˜ค๋„ˆ์‹ญ์„ ๊ฐ€์ง„ ํŒ€์ด ์ฃผ๋„

  • ํ•œ ํŒ€์ด ์ „์ฒด ๋„๋ฉ”์ธ์„ ์ฃผ๋„ (ex. ์ฃผ๋ฌธ ๋„๋ฉ”์ธ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๋‹ค๋ฅธ ํŒ€์ด ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ๋น„)
    2๏ธโƒฃ Shared Kernel (๊ณต์œ  ์ปค๋„)
  • ํ•ต์‹ฌ ๋ชจ๋ธ์„ ์ผ๋ถ€ ๊ณต์œ  (ex. ํšŒ์› ์ •๋ณด๋Š” ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉ)
    3๏ธโƒฃ Conformist (์ข…์†์  ๊ด€๊ณ„)
  • ํ•œ ํŒ€์ด ๋‹ค๋ฅธ ํŒ€์˜ ๋ชจ๋ธ์— ๋งž์ถฐ์•ผ ํ•จ

๐Ÿ’ก โžก ์ „๋žต์ ์œผ๋กœ ํŒ€๊ณผ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง


๐ŸŽฏ ์ „๋žต์  ๋””์Šคํ‹ธ๋ ˆ์ด์…˜ (Strategic Distillation)

๋ชจ๋“  ๋„๋ฉ”์ธ์ด ๋™์ผํ•˜๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค!
→ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋„๋ฉ”์ธ์— ์ตœ๊ณ ์˜ ์ธ๋ ฅ๊ณผ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง‘์ค‘ํ•ด์•ผ ํ•จ

๐Ÿ”น ํ•ต์‹ฌ ๋„๋ฉ”์ธ(Core Domain)

  • ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ๊ณต์— ๊ฒฐ์ •์ ์ธ ์—ญํ• ์„ ํ•˜๋Š” ๋„๋ฉ”์ธ
  • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ฉฐ, ๊ณ„์†ํ•ด์„œ ๋ณ€ํ™”ํ•˜๊ณ  ์ตœ์ ํ™”๋˜์–ด์•ผ ํ•จ
  • โœ… ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ฐฐ์ •

๐Ÿ”น ์ง€์› ์„œ๋ธŒ๋„๋ฉ”์ธ(Supporting Subdomain)

  • ์ฝ”์–ด ๋„๋ฉ”์ธ์„ ์ง€์›ํ•˜๋Š” ์—ญํ• 
  • ์˜ˆ: ๊ฒฐ์ œ ์‹œ์Šคํ…œ (ํ•ต์‹ฌ ๋„๋ฉ”์ธ์ด์ง€๋งŒ, ์ฃผ๋ฌธ ์‹œ์Šคํ…œ๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ํ›„์ˆœ์œ„)
  • โœ… ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœํŒ€์ด ๊ด€๋ฆฌ

๐Ÿ”น ์ œ๋„ˆ๋ฆญ ์„œ๋ธŒ๋„๋ฉ”์ธ(Generic Subdomain)

  • ๊ฒฝ์Ÿ ์šฐ์œ„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ธฐ์„ฑ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ
  • ์˜ˆ: ์ด๋ฉ”์ผ ๋ฐœ์†ก ์‹œ์Šคํ…œ, ๋กœ๊ทธ ์‹œ์Šคํ…œ
  • โœ… ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋ฐฐ์ • or ๊ธฐ์„ฑ ์†”๋ฃจ์…˜ ์‚ฌ์šฉ

๐Ÿ“Œ ์ „๋žต์  ๋””์Šคํ‹ธ๋ ˆ์ด์…˜์˜ ํ•ต์‹ฌ 1๏ธโƒฃ ํ•ต์‹ฌ ๋„๋ฉ”์ธ(Core Domain)์— ์ตœ๊ณ ์˜ ์ธ๋ ฅ ์ง‘์ค‘
2๏ธโƒฃ ๋œ ์ค‘์š”ํ•œ ๋„๋ฉ”์ธ์€ ์™ธ๋ถ€ ์†”๋ฃจ์…˜ ๋„์ž… or ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ด๋‹น
3๏ธโƒฃ ์ „์ฒด์ ์ธ SW ๋น„์ „์„ ์žƒ์ง€ ์•Š๋„๋ก ๋ช…ํ™•ํ•œ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •


๐Ÿ† ๊ฒฐ๋ก : DDD์˜ ์ „๋žต์  ์„ค๊ณ„๋ฅผ ์ ์šฉํ•˜๋ฉด?

๐Ÿ’ก ๊ธฐ์ˆ ์ ์ธ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋น„์ฆˆ๋‹ˆ์Šค์™€ ์กฐ์ง ๊ตฌ์กฐ๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค!

โœ… ๋‹จ์ผ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ”์šด๋””๋“œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค
โœ… ์ปจํ…์ŠคํŠธ ๋งต์„ ํ™œ์šฉํ•˜์—ฌ ํŒ€ ๊ฐ„ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค
โœ… ํ•ต์‹ฌ ๋„๋ฉ”์ธ์— ์ตœ๊ณ ์˜ ์ธ๋ ฅ์„ ์ง‘์ค‘ํ•˜๊ณ , ๋œ ์ค‘์š”ํ•œ ๋„๋ฉ”์ธ์€ ์™ธ๋ถ€ ์†”๋ฃจ์…˜์œผ๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ

๐Ÿ“Œ DDD์˜ ์ „๋žต์  ์„ค๊ณ„๋Š” ๋‹จ์ˆœํ•œ ์ฝ”๋“œ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ์กฐ์ง ์šด์˜ ๋ฐฉ์‹๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
๐Ÿ“Œ ๊ฒฐ๊ตญ, ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ๋น„์ฆˆ๋‹ˆ์Šค ์ „๋žต๊ณผ ํ•จ๊ป˜ ์ง„ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€