๐Ÿ’Ž ์‚ผ์„ฑ์ฒญ๋…„SW์•„์นด๋ฐ๋ฏธ(SSAFY)/SSAFYcial (๊ธฐ์ž๋‹จ)

#9. DDD ์ „๋žต์  ์„ค๊ณ„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

ming412 2024. 10. 21. 11:23

์•ˆ๋…•ํ•˜์„ธ์š”~!! 11๊ธฐ ์ตœ๋ฏผ์ฃผ ๊ธฐ์ž์ž…๋‹ˆ๋‹ค ๐Ÿ‘‹

 

ํ˜„์žฌ 11๊ธฐ๋Š” ์‹ธํ”ผ์—์„œ์˜ ๋งˆ์ง€๋ง‰ ํ”„๋กœ์ ํŠธ์ธ ์ž์œจ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ธ๋ฐ์š”,

์ €ํฌ ํŒ€์€ ํŠนํ™” ํ”„๋กœ์ ํŠธ ๋•Œ ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌํ˜„ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž์œจ ํ”„๋กœ์ ํŠธ์—์„œ MSA๋กœ ์ „ํ™˜ํ•˜๊ณ , ์ด๋ฅผ ๊ณ ๋„ํ™”ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์˜ค๋Š˜์€ ์ €ํฌ ํŒ€์ด DDD๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ์ด์œ ์™€ DDD ์ „๋žต์  ์„ค๊ณ„์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

 

1. DDD(Domain Driven Design)์ด๋ž€?

๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ์ ์ธ ๋ฌธ์ œ์˜ ์˜์—ญ๋“ค์„ ์ •์˜ํ•˜๋Š” '๋„๋ฉ”์ธ'๊ณผ, ๊ทธ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” '๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง'์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

DDD๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

 

1. ๋„๋ฉ”์ธ์˜ ๋ชจ๋ธ๊ณผ ๋กœ์ง์— ์ง‘์ค‘

2. ๋ณดํŽธ์  ์–ธ์–ด(Ubiqutous Language) ์‚ฌ์šฉ

3. Software Entity์™€ Domain ๊ฐ„ ๊ฐœ๋…์˜ ์ผ์น˜

 

2. ์™œ DDD๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ?

์•ž์„œ ์ €ํฌ ํŒ€์ด MSA ์ „ํ™”์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ์š”,

MSA ์ „ํ™˜๊ณผ DDD(Domain-Driven Design)๊ฐ€ ํ•ญ์ƒ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, MSA๋กœ ์ „ํ™˜ํ•  ๋•Œ DDD๋ฅผ ์ž์ฃผ ๋„์ž…ํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

 

3. DDD ์ „๋žต์  ์„ค๊ณ„ ๋ฐฉ๋ฒ•

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉฐ, ์ „๋žต์  ์„ค๊ณ„์˜ ๊ฐ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜: https://tech.junhabaek.net/ddd-%EC%A0%84%EB%9E%B5%EC%A0%81-%EC%84%A4%EA%B3%84-event-storming-read-model-policy-%EC%A0%95%EC%B1%85-86e30e96550f

 

 

์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ •๋ณด๋Š” ์„œ๋ฒ„์— ์ €์žฅ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

1. ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ(Domain Event)

์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ค‘์š”ํ•œ `์‚ฌ๊ฑด`์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋ณดํ†ต ๊ณผ๊ฑฐ ์‹œ์ œ ๋™์‚ฌ๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” "์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผํ’ˆ์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค", "์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผํ’ˆ์„ ์ œ๊ฑฐํ•˜์˜€๋‹ค" ๋“ฑ์ด ๋„๋ฉ”์ธ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

 

2. ์ปค๋งจ๋“œ(Command)

์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ช…๋ น์œผ๋กœ, ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

"์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผํ’ˆ์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค" ๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ปค๋งจ๋“œ๋Š” "์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผํ’ˆ ์ถ”๊ฐ€" ์ด๊ณ ,
"์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผํ’ˆ์„ ์ œ๊ฑฐํ•˜์˜€๋‹ค" ๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ์ปค๋งจ๋“œ๋Š” "์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ๋ฌผํ’ˆ ์ œ๊ฑฐ" ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

3. ์™ธ๋ถ€ ์‹œ์Šคํ…œ(External System)

์ด๋ฒคํŠธ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ์™€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ๋˜๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๋ฌผํ’ˆ ์ œ๊ฑฐ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„, "์žฌ๊ณ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ"์— ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด ํ•ด๋‹น ๋ฌผํ’ˆ์˜ ์žฌ๊ณ  ์ˆ˜๋Ÿ‰์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

4. ์•กํ„ฐ(Actor)

์—ญํ• ์„ ํ•˜๋Š” ๊ฐœ์ธ ๋˜๋Š” ์กฐ์ง

์•กํ„ฐ๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผํ’ˆ์„ ์ถ”๊ฐ€/์ œ๊ฑฐํ•˜๋Š” ์ฃผ์ฒด์ธ "์‚ฌ์šฉ์ž"์ž…๋‹ˆ๋‹ค.

 

5. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ(Aggregate)

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋‹จ์œ„๋กœ, ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ๊ฐ™์€ ๋„๋ฉ”์ธ๋“ค์„ ํ•œ๋ฐ ๋ชจ์•„๋†“์€ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. (์—ฐ๊ด€๋˜๋Š” ์—”ํ‹ฐํ‹ฐ์™€ ๊ฐ’ ๊ฐ์ฒด์˜ ๋ฌถ์Œ)

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋ฌผํ’ˆ ์ •๋ณด(๋„์„œ๋ช…, ๊ฐ€๊ฒฉ, ์ˆ˜๋Ÿ‰)๋Š” "์žฅ๋ฐ”๊ตฌ๋‹ˆ"๋ผ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

 

6. ๋ฆฌ๋“œ ๋ชจ๋ธ(ReadModel)

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

(์‚ฌ์šฉ์ž๊ฐ€ ์ปค๋งจ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•จ์— ์žˆ์–ด ๊ฒฐ์ • ๊ทผ๊ฑฐ’๊ฐ€ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์„ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.)

์‚ฌ์šฉ์ž๊ฐ€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ๋ฌผํ’ˆ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ์ž๋Š” ๋ฌด์—‡์„ ๋ณด๊ณ , ๋ฌด์—‡์„ ๊ณ ๋ คํ• ๊นŒ์š”?
1. ์‚ฌ์šฉ์ž๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ‘์ด์•ก’์ด ์ผ์ • ๊ธˆ์•ก์„ ๋„˜์—ˆ์„ ๋•Œ, ๋ฌผํ’ˆ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
2. ์‚ฌ์šฉ์ž๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ‘๋ฌผํ’ˆ ๋ชฉ๋ก๋“ค’๋กœ๋ถ€ํ„ฐ ์ œ๊ฑฐํ•  ํ•ญ๋ชฉ์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
3. ์‚ฌ์šฉ์ž๋Š” ‘๋ฌผํ’ˆ์˜ ๊ฐ€๊ฒฉ’๊ณผ ‘๋ฌผํ’ˆ์˜ ๊ฐœ์ˆ˜’๋ฅผ ๋ณด๊ณ  ์ œ๊ฑฐํ•  ํ•ญ๋ชฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
์ด ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉ์ž๋Š” ‘์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ด์•ก’, ‘๋ฌผํ’ˆ ๋ชฉ๋ก’, ‘๋ฌผํ’ˆ์˜ ๊ฐ€๊ฒฉ’, ‘๋ฌผํ’ˆ์˜ ๊ฐœ์ˆ˜’ Read Model์„ ํ™œ์šฉํ•ด ‘๋ฌผํ’ˆ ์ œ๊ฑฐ’ ์ปค๋งจ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 

7. ์ •์ฑ…(Policy)

์‹œ์Šคํ…œ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ •์˜ํ•˜๋ฉฐ, ํŠน์ • ์ด๋ฒคํŠธ๋‚˜ ์กฐ๊ฑด์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ด ๊ธˆ์•ก์ด ํŠน์ • ๊ธˆ์•ก ์ดํ•˜๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ํ• ์ธ ํ˜œํƒ์ด ์ ์šฉ๋˜์ง€ ์•Š๋„๋ก ์ •์ฑ…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ ํŒ€์˜ ์ด๋ฒคํŠธ ์Šคํ† ๋ฐ ๊ฒฐ๊ณผ

 

MSA๋กœ์˜ ์ „ํ™˜์„ ์•ž๋‘๊ณ  ์žˆ๋‹ค๋ฉด, DDD ์ „๋žต์  ์„ค๊ณ„๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”?

๊ทธ๋Ÿผ ๋‹ค์Œ ๊ธฐ์‚ฌ๋กœ ๋งŒ๋‚˜์š”, ์•ˆ๋…•-! ๐Ÿ’จ