DDD

๊ธฐ์กด์— ๊ฐœ๋ฐœ์€ MVC ํ˜•ํƒœ์˜ ๋ ˆ์ด์–ด ์•„ํ‚คํ…์ฒ˜๋กœ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

controller -> service -> repository๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๊ณ , ์˜์กด์€ ํ™”์‚ดํ‘œ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘, ํŒ€ ์Šคํ„ฐ๋”” ๋‚ด์—์„œ DDD ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

DDD๋ž€?

DDD๋Š” Domain Driven Design ์œผ๋กœ, ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๊ฐ€ ๋ฌด์Šจ๋œป์ผ๊นŒ์š”?

Domain

๋„๋ฉ”์ธ์ด๋ž€ ๊ธฐ๋Šฅ์ ์ธ ๋ฌธ์ œ์˜์—ญ์„ ์ •์˜ํ•œ ๋ถ„์•ผ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Domain Driven Design

์œ„์˜ ๋„๋ฉ”์ธ๊ณผ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

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

  • ์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด ์‚ฌ์šฉ

    • ๊ฐœ๋ฐœํŒ€ ๋งŒ์ด ์•„๋‹Œ, ๊ธฐํš ๊ฐœ๋ฐœ ๋ชจ๋‘ ๋ณดํŽธ์ ์ธ ์–ธ์–ด ์‚ฌ์šฉ

  • ์†Œํ”„ํŠธ์›จ์–ด Entity์™€ ๋„๋ฉ”์ธ ๊ฐ„ ๊ฐœ๋… ์ผ์น˜

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋Š” ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŒ€์„ ์ด๋ฃจ๊ณ  ์ง€์‹์„ ํƒ๊ตฌํ•˜์—ฌ ํ•จ๊ป˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ฐฝ์กฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์€ ์‹ค์ œ๋กœ ์ฝ”๋“œ์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด ๋ชจ๋“  ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์€ ํ•จ๊ป˜ ์ •์˜๋œ ์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

DDD์—์„œ๋Š” ์ „๋žต์  ์„ค๊ณ„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ „์ˆ ์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•ด ํ•จ๋ชฐ๋˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์˜ ๋ชฉ์ ์€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜์—ญ์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

์ „๋žต์  ์„ค๊ณ„

๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์—์„œ ๋ฌธ์ œ ๋„๋ฉ”์ธ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ ๋„๋ฉ”์ธ์„ ๋ฌธ์ œ ๊ณต๊ฐ„์œผ๋กœ ํ’€๊ณ , ํ•ด๊ฒฐ ๊ณต๊ฐ„์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๊นŒ์ง€๊ฐ€ DDD์˜ ์ „๋žต์  ์„ค๊ณ„์˜ ํฐ ํ๋ฆ„์ž…๋‹ˆ๋‹ค.

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

๋ฌธ์ œ ๊ณต๊ฐ„์„ ์ธ์‹ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜์ง€ ์•Š๊ณ , ๋ฌธ์ œ ๋„๋ฉ”์ธ์„ ์ž‘์€ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋•Œ ๋„๋ฉ”์ธ ์ง€์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ†ตํ•˜๊ณ  ํ•˜์œ„ ๋„๋ฉ”์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ์˜์‚ฌ์†Œํ†ต์„ ํ†ตํ•ด ํ•ด๋‹น ๋„๋ฉ”์ธ์˜ ๋ณธ์งˆ๊ณผ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๋ฅผ ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

DDD๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ •์˜์‚ฌํ•ญ

Bounded Context

๋ฒ”์œ„๋ฅผ ๊ตฌ๋ถ„ํ•ด๋†“์€ ํ•˜์œ„ ๋„๋ฉ”์ธ ๊ฐœ๋….

์ฝ˜ํ…์ธ  ์ œ์ž‘/๋ฉ”ํƒ€์ •๋ณด ๊ด€๋ฆฌ/ํŒ๋งค๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ”์šด๋”๋ฆฌ๋กœ ๋ฌถ์ด๊ณ  ์ด๋Š” MSA ์ƒ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ถ„๋ฅ˜๋œ Context๋Š” ์„œ๋กœ์˜ ๋„๋ฉ”์ธ์„ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ  API๋ฅผ ํ†ตํ•œ CRUD๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ Bounded Context๊ฐ€ ๋‹ค๋ฅด๋ฉด, ์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด๋„ ๋‹ฌ๋ผ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์œ„์ฒ˜๋Ÿผ ๊ฐ™์€ ์–ธ์–ด์ด์ง€๋งŒ, Bounded Context์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Context Map

Bounded Context ๊ฐ„์˜ ๊ด€๊ณ„.

Context Map.์„ ํ†ตํ•ด up/down ์ŠคํŠธ๋ฆผ์„ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Aggregate

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋‹จ์œ„. ๋ผ์ดํ”„ ์‚ฌ์ดํด์ด ๊ฐ™์€ ๋„๋ฉ”์ธ์„ ๋ชจ์•„๋†“์€ ์ง‘ํ•ฉ.

Aggregate๋Š” Root Entity๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ณ  ํ•ด๋‹น ์ ‘๊ทผ์œผ๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์€ ๋‚ด๋ถ€์˜ ๋ชจ๋“  ๊ฐ์ฒด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Aggregate๋ฅผ ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, Video Product ๋‚ด๋ถ€ ๊ฐœ๋ณ„ ๊ฐ์ฒด์˜ ์ƒํ˜ธ์ž‘์šฉ๋ณด๋‹ค๋Š” ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ Aggregate๋‚˜ ๊ฐ์ฒด๋“ค ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์กฐ๊ธˆ ๋” ๋„“์€ ์‹œ์•ผ๋กœ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ œ์•ฝ์‚ฌํ•ญ๋“ค์„ ํ•˜๋‚˜์˜ ๋งฅ๋ฝ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

DDD์— ๋Œ€ํ•œ ๊ถ๊ธˆ์ฆ

JPA Entity์™€ Domain Entity๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผœ์•ผ ํ•˜๋‚˜์š”?

์›์น™๋Œ€๋กœ๋ผ๋ฉด, JPA Entity์™€ Domain Entity๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JPA Entity๋Š” DB ๊ณ„์ธต์˜ ์–ด๋Œ‘ํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ๋•Œ, JPA Entity์™€ Domain Entity๋ฅผ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ๋А๊ปด Domain Entity๋ฅผ ์‚ญ์ œํ•˜๊ณ  JPA Entity๋ฅผ ๋„๋ฉ”์ธ ๊ณ„์ธต์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ•˜๋‚˜๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ํด๋ž˜์Šค, ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ™”๋˜์ง€๋งŒ, ์˜์†์„ฑ ๊ณ„์ธต๊ณผ ๋„๋ฉ”์ธ ๊ณ„์ธต์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Domain Entity๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์—…๋ฌด ๊ทœ์น™๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘, ์ง€์—ฐ ๋กœ๋”ฉ ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

JPA Repository?

JPA Repository๋Š” ์ถœ๋ ฅ ํฌํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋Œ‘ํ„ฐ์ž…๋‹ˆ๋‹ค.

์ถœ๋ ฅ ํฌํŠธ๋Š” Use Case๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ํ˜•ํƒœ๋Œ€๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Use Case๊ฐ€ DB์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์˜ ๋ณ€๊ฒฝ์— ์˜ํ•ด ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค๋ฉด ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ถœ๋ ฅ ํฌํŠธ์˜ ๋กœ์ง์ด ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ˆ๋‹ค.

Use Case๋ฅผ ๊ผญ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฝ‘์•„์•ผํ• ๊นŒ?

Use Case๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฝ‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ˆ๋‹ค. Controller๊ฐ€ Service์˜ ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์ด ์•Œ์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŽ™์„ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ.

์–ด๋–ป๊ฒŒ ์จ์•ผ DDD์ผ๊นŒ?

DDD์— ๋Œ€ํ•ด ์ฐพ๊ฒŒ๋œ ์ด์œ ๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ์—์„œ DDD๋ฅผ ์ ์šฉ์‹œํ‚ค๊ณ ์ž ์ฐพ์•„๋ณด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฐพ์•„๋ณผ์ˆ˜๋ก '์ด๋ ‡๊ฒŒ ํ•ด์•ผ DDD๋‹ค!' ๋ผ๋Š” ๋ฐฉ์‹์˜ ๊ฒฐ๋ก ์€ ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. DDD๋Š” ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ผ, ํ•˜๋‚˜์˜ ๋ฐ”๋ผ๋ณด๋Š”์‹œ์„ (?)์ด๋ผ๊ณ  ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜๋‹จ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์—์„œ ๊ธฐ์ˆ ์ ์ธ ๊ฒƒ์— ๋„ˆ๋ฌด ์น˜์ค‘๋˜์ง€ ๋ง๋ผ๊ณ  ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ 

Last updated