Skip to content

Latest commit

ย 

History

History
143 lines (85 loc) ยท 10.9 KB

DDD (Domain Driven Design).md

File metadata and controls

143 lines (85 loc) ยท 10.9 KB

DDD (Domain Driven Design)

Assembled by GimunLee (2020-01-13)


Introduction

์ด๋ฒˆ ์žฅ์—์„œ๋Š” ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(Domain Driven Design)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ์ง€๋Š” Domain Driven Design์˜ ์ €์ž Eric Evans์˜ ๋ง๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Eric Evans, Domain-Driven Design

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


Domain

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์— ๋Œ€ํ•ด ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋„๋ฉ”์ธ์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” "์ •๋ณด์™€ ํ™œ๋™์˜ ์˜์—ญ"์„ ๋งํ•˜๋ฉฐ, ํ”ํžˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์—๊ฒŒ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์˜ ๋กœ์ง๋“ค์ด ๊ด€์—ฌํ•˜๋Š” ์ •๋ณด์™€ ํ™œ๋™์˜ ์˜์—ญ ์ด๋ผ๊ณ  ๋ฐ›์•„๋“ค์—ฌ์ง‘๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, ์–ด๋–ค ์›น ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ํšŒ์›์„ ๊ฐ€์ž…ํ•˜๊ณ , ํšŒ์›์„ ํƒˆํ‡ดํ•˜๋Š” ์ผ๋ จ์˜ ์ž‘์—…์€ "ํšŒ์›"๊ณผ ๊ด€๋ จ๋œ ์ผ๋ จ์˜ ์ž‘์—…๋“ค์ด๋ฉฐ ์—ฌ๊ธฐ์„œ "ํšŒ์›"์ด๋ผ๋Š” ๋„๋ฉ”์ธ์ด ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


DDD (Domain Driven Design)

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋ž€ ๊ฐœ๋ฐœ์„ ํ•จ์— ์žˆ์–ด ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋„๋ฉ”์ธ์ด ์ค‘์‹ฌ์ด ๋˜๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ๋งํ•˜๋ฉฐ, ๊ทธ ๋ชฉ์ ์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์—ฐ๊ด€๋œ ๋ถ€๋ถ„๋“ค์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ณ„์†ํ•ด์„œ ์ง„ํ™”ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ชจ๋ธ์„ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€ ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์— ์žˆ์Šต๋‹ˆ๋‹ค. DDD์˜ ํ•ต์‹ฌ์ ์ธ ๋ชฉํ‘œ๋Š” ๋„๋ฉ”์ธ ๊ฐ„ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ๋„(Loose Coupling)์™€ ๋„๋ฉ”์ธ์˜ ๋†’์€ ์‘์ง‘๋„(High Cohesion)๋กœ ๊ฐ€๋ฒผ์šด ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ํƒ„์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋„๋ฉ”์ธ ๋‚ด์˜ ์—ฌ๋Ÿฌ ์—…๋ฌด ์ •์˜๋‚˜ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ชจ๋ธ๋กœ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ์ •์˜๋˜๋ƒ๊ฐ€ DDD์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ ์„ค๊ณ„์‹œ ์•„๋ž˜์˜ 3๊ฐ€์ง€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋ธ๊ณผ ํ•ต์‹ฌ ์„ค๊ณ„๋Š” ์ƒํ˜ธ ์˜ํ–ฅ์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ๊ตฌ์ฒดํ™”๋œ๋‹ค.
  2. ๋ชจ๋ธ์€ ๋ชจ๋“  ํŒ€ ๊ตฌ์„ฑ์›๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์˜ ๊ทผ๊ฐ„์„ ์ด๋ฃฌ๋‹ค.
  3. ๋ชจ๋ธ์€ ๋ถˆ์ˆœ๋ฌผ์„ ๊ฑธ๋Ÿฌ๋‚ธ ํ•ต์‹ฌ ์ง€์‹๋งŒ์„ ํฌํ•จํ•œ๋‹ค.

Ubiquitous Language (๋ณดํŽธ ์–ธ์–ด)

๋„๋ฉ”์ธ ์ฃผ๋„ ๊ฐœ๋ฐœ์€ Eric Evans๊ฐ€ 2003๋…„ ์ถœ๊ฐ„ํ•œ ์ฑ…์—์„œ ์ฒ˜์Œ ์†Œ๊ฐœํ•œ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ "์œ ์šฉํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋„๋ฉ”์ธ์— ๊ท€๋ฅผ ๊ธฐ์šธ์—ฌ๋ผ"๋ผ๋Š” ์Šฌ๋กœ๊ฑด์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์™€ ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์˜ ์˜์‚ฌ์†Œํ†ต์˜ ์–ด๋ ค์›€์€ ๋„๋ฉ”์ธ ์ปจ์…‰์˜ Ubiquitous Language ๋ผ๋Š” ๋ณดํŽธ์  ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ์ด๋Ÿฌํ•œ **๋ณดํŽธ ์–ธ์–ด(Ubiquitous Language)**์˜ ๊ทผ๊ฐ„์„ ์ œ๊ณตํ•˜๊ณ  ํŒ€ ๋‚ด์˜ ์˜์‚ฌ์†Œํ†ต ๋ฐ ๊ตฌํ˜„๊นŒ์ง€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ชจ๋ธ ๋ณ€๊ฒฝ ๋ฐ ์ฝ”๋“œ์ƒ์œผ๋กœ๋Š” Refactoring์œผ๋กœ ์ด์–ด์ง€๋Š” ๊ณผ์ •์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ณดํŽธ ์–ธ์–ด๋“ค๋กœ ์ •์˜ํ•  ๋•Œ ๊ณ ๋ ค๋˜์–ด์•ผํ•  ์‚ฌํ•ญ์€ Bounded Context(์ œํ•œ ์˜์—ญ) ๋ฒ”์œ„ ๋‚ด์—์„œ ์ •์˜ํ•ด์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Bounded Context๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์„œ๋น„์Šค ๋  ๋•Œ ๋ฌธ์ œ์—†๋Š” ์—…๋ฌด ๋ฒ”์œ„๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‡ผํ•‘๋ชฐ ์‚ฌ์ดํŠธ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด ์ œํ’ˆ ํŒ๋งค ์ปจํ…์ŠคํŠธ(Sales Context), ํŒ๋งค์ง€์› ์ปจํ…์ŠคํŠธ(Support Text) ๋“ฑ๊ณผ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์—ฌ๋Ÿฌ context ๋‚ด์— ๋น„์Šทํ•ด ๋ณด์ด๋Š” ์šฉ์–ด๊ฐ€ ์„œ๋กœ ํ‹€๋ฆฐ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์–ธ์–ด๋Š” ์ฃผ๋กœ ์—…๋ฌด ์œ„์ฃผ์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šฉ์–ด์‚ฌ์ „(Glossary) ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ๊ตฌ์„ฑ์› ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Project Wiki ์‚ฌ์ดํŠธ ๋“ฑ์„ ์šด์˜ํ•˜์—ฌ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ๊ฒƒ์€ ์šฉ์–ด์‚ฌ์ „ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ์šฉ์–ด๋ฅผ ์‚ฌ์ „์ฒ˜๋Ÿผ ์ •์˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ DDD๋Š” ํญํฌ์ˆ˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์• ์ž์ผ ๊ฐœ๋ฐœ๋ฐฉ์‹๊ณผ ๊ฐ™์€ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ํ†ตํ•œ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๋Š” Model Exploration Whirlpool(๋ชจ๋ธ ๊ฐœ๋ฐœ ์†Œ์šฉ๋Œ์ด) ๋ฐฉ์‹์„ ๋Œ€๋ถ€๋ถ„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ๋„๋ฉ”์ธ์— ๊ด€๋ จ๋œ ํ•ต์‹ฌ ์—…๋ฌด ๊ด€๋ จ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์šฉ์–ด๋ถ€ํ„ฐ ์ •์˜ํ•˜๊ณ  ๊ทธ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ์„œ๋กœ ๋†’์ด๋ฉด์„œ ์ฐจ์ธฐ ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Eric Evans, Domain-Driven Design

๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋งตํ•‘์ด ๋ช…ํ™•ํ•ด์ง€๋„๋ก ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ถฉ์‹คํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๋ผ. ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ๋” ๊นŠ์€ ์‹๊ฒฌ์„ ๋ฐ˜์˜ํ•  ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ์ˆœ๊ฐ„ ์†Œํ”„ํŠธ์›จ์–ด ๋‚ด์—์„œ ๋ชจ๋ธ์„ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋ธ์„ ์žฌ๊ฒ€ํ† ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ผ. ๊ฒฌ๊ณ ํ•œ ์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด๋ฅผ ์ง€์›ํ•จ๊ณผ ๋™์‹œ์— ๋‘ ๊ฐ€์ง€ ๋ชฉ์  ๋ชจ๋‘์— ์ž˜ ๋ถ€ํ•ฉํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ์ถ”๊ตฌํ•˜๋ผ.

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


Domain Model Pattern

๋„๋ฉ”์ธ ๋ชจ๋ธ ์ •์˜ ์‹œ ๋ช‡ ๊ฐ€์ง€ ๊ตฌํ˜„ ํŒจํ„ด์ด ์žˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์€ Entity ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์„ ์ •์˜ํ•˜๋Š” ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ํŒจํ„ด์—์„œ ์ •์˜๋˜๋Š” ์š”์†Œ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Entity

  • ์†์„ฑ์ด ์•„๋‹Œ ์‹๋ณ„์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ์ •์˜๋˜๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด
  • ex) DB : ERD (Entity - Relationship Model), J2EE : Entity Bean

Value Object

  • ์‹๋ณ„์„ฑ์ด ์•„๋‹Œ ์†์„ฑ์„ ์ด์šฉํ•ด ์ •์˜๋˜๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด
  • ๋ชจ๋“  ๊ฒƒ์— ์‹๋ณ„์„ฑ์„ ๋ถ€์—ฌํ•˜๊ณ  Entity๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ๋ณต์žก์„ฑ ์ฆ๊ฐ€
  • ๊ณผ๊ฑฐ Javadml DTO(Data Transfer Object) ํŒจํ„ด์˜ Value Object์™€ ๊ด€๊ณ„ ์—†์Œ
  • Entity์™€ Value Object๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์กฐ๊ฑด์€ ์‹๋ณ„์„ฑ
  • ์‹๋ณ„์„ฑ์„ ๊ฐ€์ง€๋ฉด Entity, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Value Obeject

Service

  • Domain Object์—์„œ ์œ„์น˜์‹œํ‚ค๊ธฐ ์–ด๋ ค์šด Operation์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด
  • ์—ฌ๋Ÿฌ Domain Object๋ฅผ ๋‹ค๋ฃจ๋Š” ์—ฐ์‚ฐ (Servicedml Operation์€ ์ผ๋ฐ˜์ ์œผ๋กœ stateless)
  • Domain Object์— ํ•ด๋‹น๋˜๋Š” ์—ญํ• ์„ Service Operation์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ, ๋„๋ฉ”์ธ ์—ญํ• ์„ ์นจ๋ฒ”ํ•˜์—ฌ ๊ฒฐํ•ฉ๋„๊ฐ€ ๊ฐ•ํ•ด์ง

Module

  • ์œ ์‚ฌ ์ž‘์—… ๋ฐ ๊ฐœ๋…์„ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋ณต์žก๋„๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•
  • ์‘์ง‘๋„๊ฐ€ ๋†’์€ ๋ชจ๋“ˆ์€ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋Š” ๊ฒฐํ•ฉ๋„๊ฐ€ ์•ฝํ•ด์ง
  • Java๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ Package๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Œ

Aggregate

  • ์—ฐ๊ด€๋œ Entity์™€ Value Object์˜ ๋ฌถ์Œ, ์ผ๊ด€์„ฑ๊ณผ ํŠธ๋žœ์žญ์…˜, ๋ถ„์‚ฐ์˜ ๋‹จ์œ„, ์บก์Šํ™”๋ฅผ ํ†ตํ•œ ๋ณต์žก์„ฑ ๊ด€๋ฆฌ
  • ex) ์‡ผํ•‘๋ชฐ ์‚ฌ์ดํŠธ์—์„œ ์ฃผ๋ฌธ Entity ๋‚ด์— ๋ฐฐ์†ก์ฃผ์†Œ ์ •๋ณด๋ฅผ ์šฐํŽธ๋ฒˆํ˜ธ, ์ฃผ์†Œ1, ์ฃผ์†Œ2, ์ƒ์„ธ์ฃผ์†Œ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ ์นผ๋Ÿผ์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฃผ์†Œ๋ผ๋Š” Value Obeject๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ฃผ๋ฌธ Entity๋Š” ์ฃผ์†Œ Value Object๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ด€๊ณ„ ์ผ๊ด€์„ฑ ๋ฐ ๋‹จ์ˆœํ™”๋ฅผ ์œ ์ง€

Factory

  • ๋ณต์žกํ•œ Entity์˜ ์ƒ์„ฑ ์ ˆ์ฐจ์— ์บก์Šํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋…
  • ์ƒ์„ฑํ•˜๊ธฐ ๋ณต์žกํ•œ Aggregate ๋‚ด์˜ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ๋™์‹œ์— ์ƒ์„ฑ
  • ์ƒ์„ฑ์‹œ Aggregate์˜ ์ผ๊ด€์„ฑ ์œ ์ง€

Repository

  • ๋„๋ฉ”์ธ ์˜์—ญ๊ณผ Data Infrastructure ๊ณ„์ธต์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ณ„์ธต์— ๋Œ€ํ•œ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•œ ๋ฐฉ์•ˆ
  • ์ƒ์„ฑ๋œ Aggregate์— ๋Œ€ํ•œ ์˜์†์„ฑ ๊ด€๋ฆฌ, ์กฐํšŒ, ๋“ฑ๋ก, ์ˆ˜์ •, ์‚ญ์ œ ์‹œ Aggregate์˜ ์ผ๊ด€์„ฑ ์œ ์ง€
  • DB ๋ฐ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ Repository๋ฅผ ํ™œ์šฉ

Bounded Context

๊ธฐ์—… ๋‚ด ์›น ์„œ๋น„์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์–‘ํ•œ Context๋กœ ๊ตฌ๋ถ„๋˜์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ๊ถŒ ์„œ๋น„์Šค๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๋ฆฌ์„œ์น˜
  • ์ฃผ์‹
  • ํŽ€๋“œ
  • ์ด์ฒด

์œ„์™€ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ์—…๋ฌด๋Š” ๋ถ„ํ• ๋œ ์ปจํ…์ŠคํŠธ(Bounded Context)๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ Context์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋ธ์€ ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผํ•˜๋ฉฐ, ๊ฐ ํ•˜๋‚˜์˜ Context๋Š” ํ•˜๋‚˜์˜ ํŒ€์— ํ• ๋‹น๋˜์–ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋ฐฉํ–ฅ์€ Microservice Architecture์—์„œ ์ถ”๊ตฌํ•˜๋Š” ๋ฐฉํ–ฅ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ๊ฒƒ์€ Bounded Context๋Š” Module๊ณผ ๋‹ค๋ฅธ ์˜์—ญ์ด๋ฉฐ, ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ์ง‘์ค‘ํ•˜๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ž˜ ๊ตฌ์„ฑ๋œ Bounded Context ๋‚ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋…๋ฆฝ์  ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ Context ๊ฐ„์˜ ๋ชจ๋ธ ๋ฐ ๋ฐ์ดํ„ฐ ์ฐธ์กฐ๋Š” ์ •ํ™•ํžˆ ์ •์˜๋œ ์ธํ„ฐํŽ˜์ด์Šค(API) ๋งŒ์œผ๋กœ ํ†ต์‹ ํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  MSA์— ์ถ”๊ตฌํ•˜๋Š” Service ๋‹จ์œ„๋Š” ์ด๋ณด๋‹ค ๋” ์ž‘์€ ๋‹จ์œ„์ง€๋งŒ, ๊ธฐ์กด Monolithic Architecture์—์„œ MSA ์ค‘๊ฐ„ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค๋ฉด Bounded Context ๋‹จ์œ„๋กœ ์˜์—ญ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹œ์Šคํ…œ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๋ฌธ์„œํ™” ๋ฐฉ์•ˆ

๊ทธ๋Ÿผ DDD๋ฅผ ํ†ตํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์‹œ, ์–ด๋–ป๊ฒŒ ๋ฌธ์„œํ™”ํ• ์ง€ ๊ณ ๋ฏผํ•ด ๋ณด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐํ™”๋œ UML ๋‹ค์ด์–ด๊ทธ๋žจ ๋˜๋Š” ๊ทธ์™€ ์œ ์‚ฌํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜•์‹์ด ์ค‘์š”ํ•œ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ด€๋ จ์ž๊ฐ€ ํ•จ๊ป˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์‹ฌ ์—ญํ• ์„ ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋ธ๋ง์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ๋‚˜๋ฌด๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ˆฒ์„ ๋ณด๋Š” ๊ฒƒ์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ํฌํ•จํ•˜์—ฌ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ณ , ๋„ˆ๋ฌด ์ƒ์„ธํ™” ์‹œํ‚ฌ ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. UML ์ž‘์„ฑ ์‹œ ์ฃผ์˜์ ์€ UML ์ž์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ์ •๋ณด ์ „๋‹ฌ์˜ ํ•œ๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์ธ ์–ธ์–ด ๊ธฐ์ˆ (desription)์„ ํ†ตํ•ด ๊ฐ ์š”์†Œ์˜ ์•„์ด๋””์–ด ํ•ต์‹ฌ์„ ๋‹ด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Eric Evans, Domain-Driven Design

๋ชจ๋ธ์„ ์–ธ์–ด์˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์•„๋ผ. ํŒ€์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ๋ชจ๋“  ์˜์‚ฌ์†Œํ†ต๊ณผ ์ฝ”๋“œ์— ์ ๊ทน์ ์œผ๋กœ ๊ณตํ†ต์˜ ์–ธ์–ด๋ฅผ ์ ์šฉํ•˜๋ผ.

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

๊ทธ ํ›„ ์ƒˆ๋กœ์šด ๋ชจ๋ธ์— ์ ํ•ฉํ•˜๋„๋ก ํด๋ž˜์Šค, ๋ฉ”์†Œ๋“œ, ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋ผ. ์ผ์ƒ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ์˜๋ฏธ์— ๋Œ€ํ•œ ๊ณต๊ฐ๋Œ€๋ฅผ ํ˜•์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋Œ€ํ™”์— ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด ์ƒ์˜ ํ˜ผ๋ž€ ์—ญ์‹œ ํ•ด๊ฒฐํ•˜๋ผ. Ubiqutious Language์˜ ๋ณ€๊ฒฝ์€ ๊ณง ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ์ธ์‹ํ•˜์ž.


Reference & Additional Resources