Skip to content

Latest commit

ย 

History

History
140 lines (102 loc) ยท 6.83 KB

File metadata and controls

140 lines (102 loc) ยท 6.83 KB

DDD (Domain-Driven Design)

๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

๊ฐ์ฒด์ง€ํ–ฅ์—์„œ์˜ ํ•ต์‹ฌ์€ ์‹ค์„ธ๊ณ„์˜ ๊ฐ์ฒด(๋ฌผ๊ฑด, ์‚ฌ๋žŒ, ์ฃผ๋ฌธ, ... ์ฃผ๋„์ ์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ƒ์‚ฐํ•˜๋Š” ์ฃผ์ฒด)๋“ค์ด
์„œ๋กœ ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ฑ…์ž„, ํ˜‘๋ ฅ, ์—ญํ•  ์˜ ๊ฐ€์ง€๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ

=> ๊ฒฐ๊ตญ ๊ฐ์ฒด(๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“œ๋Š” ์ฃผ์ฒด)๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๊ฐ์ฒด๋“ค์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ถ”๋ ค๋‚ด๊ณ ,
์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ ,
์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ด ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

=> ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์ด๋‹ค.


DDD ์ •์˜

  • Domain-Driven Design ๋˜๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„

  • ๋„๋ฉ”์ธ ํŒจํ„ด์„ ์ค‘์‹ฌ์— ๋†“๊ณ  ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ์‹

  • ๋„๋ฉ”์ธ์€ ์‹ค์„ธ๊ณ„์—์„œ ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•˜๋Š” ์ง‘ํ•ฉ ์ด์ž ์†Œํ”„ํŠธ์›จ์–ด๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ ์˜์—ญ

    • ์˜ˆ์‹œ: ๋„์„œ ๊ตฌ๋งค ์‚ฌ์ดํŠธ
      • Order Domain: ๋„์„œ ๊ตฌ๋งค ์‚ฌ์ดํŠธ์—์„œ ์ฃผ๋ฌธ์„ ํ•˜๋Š” ๋„๋ฉ”์ธ
      • Delivery Domain: ๋ฐฐ์†ก์„ ๋‹ด๋‹นํ•˜๋Š” ๋„๋ฉ”์ธ
      • Member Domain: ํšŒ์›์„ ๊ด€๋ฆฌํ•˜๋Š” ๋„๋ฉ”์ธ
    • โžก๏ธ ์ด๋Ÿฌํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋„๋ฉ”์ธ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋ฉฐ, ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„

DDD ํŠน์ง•

  • ๊ฐ™์€ ๊ฐ์ฒด(Object or Class)๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ์‹œ: ์˜ท ์‡ผํ•‘๋ชฐ
      • ์ฃผ๋ฌธ ๋„๋ฉ”์ธ์—์„œ์˜ ์˜ท์€ ์†๋‹˜๋“ค์—๊ฒŒ ํŒ”๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด ์ •๋ณด(name, price, ...etc)
      • ์˜ท ๊ด€๋ฆฌ ๋„๋ฉ”์ธ์—์„œ์˜ ์˜ท์€ ์ ์ฃผ ์ž…์žฅ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด ์ •๋ณด(madeTime, size, madeCountry, ...etc)๋“ค ์œ„์ฃผ
  • ์ฆ‰, ๋ฌธ๋งฅ(Context)์— ๋”ฐ๋ผ ๊ฐ์ฒด(Object)์˜ ์—ญํ• ์„ ๋ฐ”๋€๋‹ค.

  • ์ฆ‰, ์–ด๋– ํ•œ ์ƒํ™ฉ์—์„œ ๋ฐ”๋ผ๋ณผ ๊ฒƒ์ธ๊ฐ€? ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด์•ผ ํ•˜๊ณ , ์ด๋ฅผ Bounded Context ๋ผ๊ณ  ํ•œ๋‹ค.

Bounded Context

  • ๋„๋ฉ”์ธ ์˜์—ญ์˜ ๊ฒฝ๊ณ„
  • Bounded Context์— ๋”ฐ๋ผ์„œ Model๋“ค์˜ ์—ญํ• ๊ณผ ์ฑ…์ž„์€ ๋‹ฌ๋ผ์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ์™ธ๋ถ€(public)๋กœ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๊ณ , package-private์œผ๋กœ ๋‚ด๋ถ€์—์„œ๋งŒ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ ๋” ๋‚˜์•„๊ฐ€์„œ ์ง์ ‘ ์„œ๋น„์Šค์— ์ ์šฉ์‹œํ‚จ ๊ฒƒ์ด MicroService(๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค) ์ด๋‹ค.
  • ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ์€ ์„œ๋กœ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌ๋˜๊ณ , ๋†’์€ ์‘์ง‘๋ ฅ๊ณผ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋กœ ๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์— ์šฉ์ดํ•œ ์„ค๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค.

cf.

  • ๊ฒฐํ•ฉ๋„(coupling)
    • ์†Œํ”„ํŠธ์›จ์–ด ์ฝ”๋“œ์˜ ํ•œ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€, ๋˜ํ•œ ์–ผ๋งˆ๋‚˜ ์˜์กด์ ์ธ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋„
  • ์‘์ง‘๋„(cohesion)
    • ํ”„๋กœ๊ทธ๋žจ์˜ ํ•œ ์š”์†Œ๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ผ๋งˆ๋งŒํผ์˜ ์—ฐ๊ด€๋œ ์ฑ…์ž„๊ณผ ์•„์ด๋””์–ด๊ฐ€ ๋ญ‰์ณ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๋„
    • ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•œ ์š”์†Œ๊ฐ€ ํŠน์ • ๋ชฉ์ ์„ ์œ„ํ•ด ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋œ ๊ธฐ๋Šฅ๋“ค์ด ๋ชจ์—ฌ์„œ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ , ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์€ ์ผ์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ทธ๊ฒƒ์„ ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ ๋ฐฉ์‹

ํฌ๊ฒŒ 3๊ฐ€์ง€ Layer๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  1. Application Layer
    a. ์ฃผ๋กœ ๋„๋ฉ”์ธ๊ณผ Repository๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ์„œ๋น„์Šค(API)๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ณ„์ธต

  2. Domain Layer
    a. Entity, VO(Value Object)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„๋ฉ”์ธ ๋กœ์ง์ด ์ง„ํ–‰๋˜๋Š” ๊ณ„์ธต
    b. Entity
    1) ๊ณ ์œ  ์‹๋ณ„์ž(PK)๋ฅผ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด
    2) ์‹๋ณ„์ž๋Š” ๊ณ ์œ ํ•˜๋˜ ์—”ํ‹ฐํ‹ฐ์˜ ์†์„ฑ ๋ฐ ์ƒํƒœ๋Š” ๊ณ„์† ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
    3) ๋„๋ฉ”์ธ์˜ ๊ณ ์œ ํ•œ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•œ๋‹ค. (์˜ˆ: ์ฃผ๋ฌธ-Order, ํšŒ์›-Member, ์ƒํ’ˆ-Product)
    c. Value
    1) ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.
    2) ํ•˜๋‚˜์˜ ๊ฐ’์„ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    3) ๋‹ค๋ฅธ ๋ฒจ๋ฅ˜ ํƒ€์ž…์˜ ์†์„ฑ์œผ๋กœ๋„ ์‚ฌ์šฉ๋œ๋‹ค. (์˜ˆ: ์ฃผ์†Œ, ์šฐํŽธ๋ฒˆํ˜ธ)

  3. Infrastructure Layer
    a. ์™ธ๋ถ€์™€์˜ ํ†ต์‹ (ORM, DB, NoSQL) ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต
  • ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ๋“ค์„ ์œ„์™€ ๊ฐ™์€ Layer๋กœ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•ด์„œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด DDD์˜ ํ•ต์‹ฌ ์„ค๊ณ„ ๋ฐฉ์‹
  • ์„ค๊ณ„ํ•œ ๋„๋ฉ”์ธ๋“ค์„ ๋ชจ๋“ˆ(Module) ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(MicroService)
  • DDD์˜ ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ ๋„๋ฉ”์ธ์„ ์„œ๋น„์Šค ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋ผ!

๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ๋น„๊ต

๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜

  • ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜๊ณ  ๋‹จ์ผ ์„œ๋น„์Šค๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•œ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ์ˆ˜์š”๊ฐ€ ๊ธ‰์ฆํ•˜๋ฉด ํ•ด๋‹น ์•„ํ‚คํ…์ฒ˜ ์ „์ฒด๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•œ๋‹ค.
  • ์ข…์† ๊ด€๊ณ„๋ฅผ ์ด๋ฃจ๋ฉฐ ๊ธด๋ฐ€ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ๋งŽ์€ ํ”„๋กœ์„ธ์Šค๋กœ ์ธํ•ด ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค์˜ ์‹คํŒจ๋กœ ์ธํ•œ ์˜ํ–ฅ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ€์šฉ์„ฑ์— ๋Œ€ํ•œ ์œ„ํ—˜์„ ๊ฐ€์ค‘์‹œํ‚จ๋‹ค.

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋…๋ฆฝ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์ถ•๋˜์–ด ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋น„์Šค๋กœ ์‹คํ–‰๋œ๋‹ค.
  • ์„œ๋น„์Šค๋Š” ๋น„์ง€๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ตฌ์ถ•๋˜๋ฉฐ ์„œ๋น„์Šค๋งˆ๋‹ค ํ•œ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ์„œ๋น„์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์ˆ˜์š”๋ฅผ ์ถฉ์กฑํ•˜๋„๋ก ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋ฅผ ์—…๋ฐ์ดํŠธ, ๋ฐฐํฌ ๋ฐ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Aggregate Pattern



  • ์—ฐ๊ด€๋œ Entity ์™€ Value Object ์˜ ๋ฌถ์Œ
  • ์ฃผ๋ฌธ๊ณผ ๊ด€๋ จ๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋“ค ๊ฐ„์—๋Š” ๋น„์ง€๋‹ˆ์Šค ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ์œผ๋ฉฐ ๋น„์ง€๋‹ˆ์Šค ์ •ํ•ฉ์„ฑ์„ ๋งž์ถœ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‹จ์œ„๊ฐ€ ํŠธ๋žœ์žญ์…˜์˜ ๊ธฐ๋ณธ ๋‹จ์œ„๊ฐ€ ๋œ๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ ์˜์—ญ์„ ๋Œ€ํ‘œํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋กœ Aggregate ์ด๋‹ค.
  • ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ์— Repository๋กœ ๋ฌถ์–ด์•ผ ํ•˜๋Š” ๊ฐ์ฒด(Entity)๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Aggregate Root

  • ์ˆ˜๋ฌธ์žฅ ๋˜๋Š” ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ƒ์˜ ๊ฐ์ฒด
  • OrderItem์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  ๋ฐ˜๋“œ์‹œ Order๋ฅผ ํ†ตํ•ด์„œ ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค.
  • ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ Bounded context ๋‚ด์—์„œ ์ ‘๊ทผ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ด๊ฐ€ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ๋„ ๋†’์•„์ง„๋‹ค.

์™œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์—ฌ์•ผ ํ• ๊นŒ?

๊ธฐ์กด์—๋Š” Hypervisor ๊ธฐ๋ฐ˜์˜ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜์˜€๋‹ค๋ฉด,
์ง€๊ธˆ์€ Domain Service ์ค‘์‹ฌ์œผ๋กœ Container๋ฅผ Scale In / Out ํ•˜๋Š” Ops ํ™˜๊ฒฝ์ด ๋Œ€์„ธ๊ฐ€ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


references

DDD
DDD
๊ฒฐํ•ฉ๋„, ์‘์ง‘๋„
microservices