๐Ÿก DDD ์ ์šฉํ•˜๊ธฐ - 1

ozzingยท2022๋…„ 10์›” 29์ผ
0

DDD

๋ชฉ๋ก ๋ณด๊ธฐ
1/3

์ง€๋‚œ ํ”„๋กœ์ ํŠธ์—์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์„ ๊ฑฐ์น˜๋ฉฐ ์•„ํ‚คํ…์ฒ˜์— ๊ด€ํ•œ ๊ด€์‹ฌ์ด ๋†’์•„์กŒ๋‹ค. DDD ์ฑ…์„ ์ถ”์ฒœ ๋ฐ›๊ณ  ์ธํ„ฐ๋„ท์„ ์—ด์‹ฌํžˆ ์„œํ•‘ํ•˜๋ฉฐ ๊ณต๋ถ€ ์ค‘์ด๋‹ค.

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


0. DDD ๊ฐœ๋… ์ •๋ฆฌ

Entity : ๊ณ ์œ ํ•œ ์‹๋ณ„์ž๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด, ๋„๋ฉ”์ธ์˜ ์ฃผ์š” ํด๋ž˜์Šค

DDD์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ์—ญํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์—ญํ• 
ex) ์ž๊ธฐ์†Œ๊ฐœ์„œ

Value : ๋„๋ฉ”์ธ์—์„œ ๊ฐœ๋…์ ์œผ๋กœ ํ•˜๋‚˜์ธ ๊ฐ์ฒด

๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐœ๋…์ธ ๊ฒฝ์šฐ์— ํ•ด๋‹น
๋ถˆ๋ณ€์œผ๋กœ ๊ตฌํ˜„๋˜๋„๋ก ๊ถŒ์žฅ
ex) ์ž‘์„ฑ์ž (์ž‘์„ฑ์ž์˜ ์ด๋ฆ„, ์ž‘์„ฑ์ž์˜ ์ด๋ฉ”์ผ ๋“ฑ)

DIP : ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๊ตฌ์กฐ

๊ฐ์ฒด์ง€ํ–ฅ์„ค๊ณ„ 5์›์น™ SOLID ์ค‘ D์— ํ•ด๋‹น
Dependancy Inversion Principle(์˜์กด ์—ญ์ „ ์›์น™)์œผ๋กœ, ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ด ์ง์ ‘ ์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  ๊ณ ์ˆ˜์ค€ ๋ชจ๋“ˆ์ธ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กด
์ €์ˆ˜์ค€ ๋ชจ๋“ˆ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„ ์‹ค์ œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰

Aggregate : ๊ฐœ๋ณ„ ๊ฐ์ฒด ์ค‘ ๊ด€๋ จ๋œ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜๋กœ ๊ทธ๋ฃนํ™” ํ•ด์ฃผ๋Š” ๊ฒƒ

ex) ์ž๊ธฐ์†Œ๊ฐœ์„œ ํšŒ์‚ฌ ์ •๋ณด + ์งˆ๋ฌธ + ๋‹ต๋ณ€ == ์ž๊ธฐ์†Œ๊ฐœ์„œ Aggregate


์ผ๋‹จ DDD๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์ „์— ๊ธฐ์กด์— ํ•˜๋˜๋Œ€๋กœ DB ์„ค๊ณ„์™€ ORM ์ž‘์„ฑ์„ ๋งˆ์นœ ์ƒํƒœ์ด๋‹ค. ๊ณต๋ถ€ํ•˜๋ฉฐ ํ™•์ธํ•œ ๋‚ด์šฉ์— ๋งž์ถ”์–ด ์ˆ˜์ •ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

1. Aggregate ๋‹จ์œ„๋กœ ๊ฐ์ฒด ๋ฌถ๊ธฐ

์บก์Šคํ†ค๋””์ž์ธ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์กด DB๋‹ค. ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ž…๋ ฅ, ์ˆ˜์ •, ์ €์žฅ, ์‚ญ์ œ, ๋ถ„์„ ๋“ฑ์˜ ๊ธฐ๋Šฅ๋งŒ์„ ๊ฐ€์ง„ ๋ฐฑ์—”๋“œ์—๊ฒŒ๋Š” ๋น„๊ต์  ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋ผ DB๊ฐ€ ์กฐ๊ทธ๋งฃ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ Aggregate ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๋ณด์•˜๋‹ค.

ํšŒ์› Aggregate

ํšŒ์› ๋ฐ์ดํ„ฐ User Entity
ํšŒ์›์˜ ๊ตฌ๋งค ์—ฌ๋ถ€(Plan)์„ ๋‚˜ํƒ€๋‚ด๋Š” PlanStatus Value

์ž๊ธฐ์†Œ๊ฐœ์„œ Aggregate

์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ฐ์ดํ„ฐ Form Entity
์ž๊ธฐ์†Œ๊ฐœ์„œ ์ž‘์„ฑ ์ค‘/์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” FormStatus Value
์ž๊ธฐ์†Œ๊ฐœ์„œ ํ•ญ๋ชฉ๊ณผ ๋‹ต๋ณ€์„ ๋‚˜ํƒ€๋‚ด๋Š” Question Value

ํšŒ์‚ฌ Aggregate

ํšŒ์‚ฌ ๋ฐ์ดํ„ฐ Company Entity

๋ฉด์ ‘ Aggregate

๋ฉด์ ‘ ๋ฐ์ดํ„ฐ Interview Entity
๋ฉด์ ‘ ์งˆ๋ฌธ์˜ ๋ถ„๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” InterviewCategory Value

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

๋ฐ˜๋Œ€๋กœ Company์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ ํšŒ์‚ฌ ์ด๋ฆ„๋งŒ์„ ์ €์žฅํ•˜๋Š” Form์˜ ํ•œ ์ปฌ๋Ÿผ์œผ๋กœ ์ทจ๊ธ‰ํ–ˆ๋Š”๋ฐ, ๊ทธ ๊ฐœ๋… ์ž์ฒด๊ฐ€ ์ž๊ธฐ์†Œ๊ฐœ์„œ์— ์ข…์†๋˜์ง€๋„ ์•Š์„ ๋ฟ๋”๋Ÿฌ ํšŒ์‚ฌ์˜ ์ •๋ณด๊ฐ€ ๋” ํ•„์š”ํ•˜๊ฒŒ ๋˜๊ฑฐ๋‚˜ 'ํšŒ์‚ฌ๋ณ„ ์ž๊ธฐ์†Œ๊ฐœ์„œ', 'ํšŒ์‚ฌ๋ณ„ ๋ฉด์ ‘' ๋“ฑ์˜ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ ๋“ฑ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•ด ์ƒˆ๋กœ์šด Entity ๋ฐ Aggregate๋กœ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

2. Value ๊ฐ’ ๋ณ€๊ฒฝ

Value ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ๋ถˆ๋ณ€์ธ ์ƒํƒœ๋กœ ๊ตฌํ˜„๋˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ํŠนํžˆ Setter ์‚ฌ์šฉ์„ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. Set ๋ฉ”์†Œ๋“œ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋ฉด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง
  2. Set ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๊ณง๋ฐ”๋กœ Value ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด, ์ด์ „์— ํ•„์š”ํ•œ ์ผ๋ จ์˜ ๊ฒ€์ฆ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•„ ์œ„ํ—˜ํ•จ

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์™ธ๋ถ€์—์„œ Value ๊ฐ’์„ ๋ฐ”๊พธ์–ด์ค„ ๋•Œ๋Š” ์•„์˜ˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ด์„œ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พธ์–ด์ค€๋‹ค. ๋˜ ๋‚ด๋ถ€ ์ƒํƒœ์˜ ๋ณ€๊ฒฝ์€ Aggregate Root๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ง„๋‹ค.

3. Aggregate Root

Aggregate Root๋Š” Aggregate ์ „์ฒด์˜ ์ผ๊ด€์„ฑ์ด ๊นจ์ง€์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•ด์ฃผ๋Š” Entity๋กœ, Aggregate ๋‚ด ๋‹ค๋ฅธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ๊ตฐ๋ฐ์—์„œ ๋กœ์ง์ด ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค. ์—ญํ• ์€ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ „ ์ƒํƒœ ์ ๊ฒ€
  2. ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์„ ํ˜ธ์ถœํ•˜์—ฌ ์‹คํ–‰ ์œ„์ž„

๋Œ€๊ฐœ ํ•œ Aggregate๋Š” Entity๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๊ณ  ํ•œ๋‹ค.
์˜ˆ์‹œ์˜ ์ž๊ธฐ์†Œ๊ฐœ์„œ Aggregate์—์„œ๋Š” Form์ด Aggregate Root์— ํ•ด๋‹นํ•œ๋‹ค.

๋ณดํ†ต์€ ํŠธ๋žœ์žญ์…˜์˜ ๋‹จ์œ„๊ฐ€ ํ•œ Aggregate์˜ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š”๋ฐ, Aggregate๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ํ…Œ์ด๋ธ”๋“ค์ด ์ „๋ถ€ ์ž ๊ธฐ๊ฒŒ ๋˜์–ด ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŠธ๋žœ์žญ์…˜์˜ ์ˆ˜๊ฐ€ ํ˜„์ €ํžˆ ์ค„์–ด๋“ ๋‹ค.

Repository๋„ ํ•œ Aggregate๋ฅผ ๋‹ด๋‹นํ•˜๋„๋ก ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. Aggregate์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์›์ž์ ์œผ๋กœ ๋ฐ˜์˜์ด ๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


์—ฌ๊ธฐ๊นŒ์ง€ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€