๊ฐœ์š”

DDD์™€ ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ–ˆ์ง€๋งŒ, ๋‚˜๋Š” ํ‰๋‚ด๋งŒ ๋‚ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฒˆ ๊ธ€์€ ๋‚ด๊ฐ€ ํ—ท๊ฐˆ๋ ธ๋˜ ์ง€์ ์„ ์ •๋ฆฌํ•˜๊ณ  ์‹ค๋ฌด ์ฝ”๋“œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‚˜๋งŒ์˜ ๊ธฐ์ค€์„ ์„ธ์›Œ๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ •๋ฆฌ ๊ณผ์ •์—์„œ ChatGPT์˜ ๋„์›€์„ ๋ฐ›์•˜๊ณ , ๋‚ด์šฉ์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ์— ์ง€์†์ ์œผ๋กœ ๋ณด์™„ํ•  ์˜ˆ์ •์ด๋‹ค.

 

 

๋„๋ฉ”์ธ

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

  • ๊ธˆ์œต : ๋Œ€์ถœ, ๋ณดํ—˜, ์˜ˆ์ ๊ธˆ ๋“ฑ
  • ์ปค๋จธ์Šค : ์ƒํ’ˆ, ์ „์‹œ, ์ฃผ๋ฌธ, ๊ฒฐ์ œ, ์œ ํ†ต ๋“ฑ
  • ๋ชจ๋นŒ๋ฆฌํ‹ฐ : ๋ฒ„์Šค, ์ง€ํ•˜์ฒ , ํƒ์‹œ, ๋‚ด๋น„ ๋“ฑ
  • ๊ด‘๊ณ  : ์ž…์ฐฐ, ๊ณผ๊ธˆ, ํƒ€๊ฒŸํŒ… ๋“ฑ

 

๋„๋ฉ”์ธ ๋กœ์ง

๋„๋ฉ”์ธ์ด ๊ฐ€์ง„ ๊ณ ์œ ์˜ ๊ทœ์น™๊ณผ ๋…ผ๋ฆฌ ๋ชจ์Œ์ด๋‹ค. ๋„๋ฉ”์ธ ๋กœ์ง์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์ƒํƒœ์™€ ํ–‰์œ„๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง€๋ฉฐ ํ–‰๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค. ๋ฐ˜๋ฉด ์œ ์ฆˆ์ผ€์ด์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ๋ฆ„์ œ์–ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒŒ์ธต์˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ฑ…์ž„์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

  • ์œ ์ฆˆ์ผ€์ด์Šค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง
  • ๋„๋ฉ”์ธ ๊ทœ์น™ : ๋„๋ฉ”์ธ ๋กœ์ง

๋„๋ฉ”์ธ ๋กœ์ง์€ ๊ฐ€๋Šฅํ•œ Aggregate ๋‚ด๋ถ€๋กœ ๋‘๊ณ  ์Šค์Šค๋กœ ๊ทœ์น™์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋ธ ๋‚ด๋ถ€์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ๋กœ์ง๋“ค์€ ๋„๋ฉ”์ธ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ (Aggregate)

๋„๋ฉ”์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ๊ณ„๋ฅผ Aggregate ๋ผ๊ณ  ํ•œ๋‹ค. Repository๋ฅผ ํ†ตํ•ด์„œ Aggregate๋ฅผ ์กฐํšŒ/์ €์žฅํ•œ๋‹ค. ์™ธ๋ถ€์—์„  Aggregate Root๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋‚ด๋ถ€์˜ ํ–‰์œ„๋กœ ๋„๋ฉ”์ธ ๊ทœ์น™์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค๊ณ„ํ•œ ๋ฐฉ์‹์„ Rich Domain Model์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋„๋ฉ”์ธ ๋กœ์ง์ด ๋ชจ๋ธ ๋ฐ–์— ์žˆ๊ณ , ๊ฐ’๋งŒ ๋‹ด๋Š” DTO์ฒ˜๋Ÿผ ๋˜์–ด์žˆ๋‹ค๋ฉด ๊ทธ๊ฑด Anemic Domain Model์— ๊ฐ€๊น๋‹ค.

 

 

๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์™€ DDD

๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์˜์กด์„ฑ์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ํ๋ฅธ๋‹ค. ์ด ๋‹จ๋ฐฉํ–ฅ ์ž์ฒด๋Š” ๋„๋ฉ”์ธ์ด ์ธํ”„๋ผ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ์ง€๋งŒ, 3 Layer ๋ฅผ ์ธํ”„๋ผ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋ฉด ๋„๋ฉ”์ธ ์ฝ”๋“œ๊ฐ€ ์ธํ”„๋ผ์— ๊ฒฐํ•ฉ๋˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

DDD ๊ด€์ ์—์„œ๋Š” ๋„๋ฉ”์ธ์„ ์™ธ๋ถ€ ๊ธฐ์ˆ ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด, ๋„๋ฉ”์ธ ๊ณ„์ธต์ด ์ธํ”„๋ผ ๊ตฌํ˜„์— ์ง์ ‘ ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•œ๋‹ค. ๋„๋ฉ”์ธ์ด ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด ์ง€์ ์€ Port (์ธํ„ฐํŽ˜์ด์Šค) ๊ฐ™์€ ์ถ”์ƒํ™”๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์‹ค์ œ ๊ตฌํ˜„์ฒด๋Š” ์ธํ”„๋ผ ๊ณ„์ธต์— ๋‘๋˜, Port๋ฅผ ํ–ฅํ•˜๋„๋ก ํ•œ๋‹ค. (DIP ์›์น™)

 

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

 

 

๊ฒฐ๋ก 

DDD ๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ๋ฌด์—‡์„ ์ค‘์‹ฌ์— ๋‘˜ ๊ฒƒ์ธ์ง€ ์„ค๊ณ„ํ•˜๋Š” ๊ด€์ . ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜๋Š” ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆŒ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ตฌ์กฐ์  ๊ด€์ ์ด๋‹ค. ์ด ๋‘˜์€ ๋ชฉ์ ์ด ๋‹ค๋ฅด๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ค‘์‹ฌ์— ๋‘๊ณ  ์ด๋ฅผ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ด์„œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ๋‘ ๋ชฉ์ ์€ ์„œ๋กœ ์˜๋ฏธ ์žˆ๊ฒŒ ๋ถ€ํ•ฉ๋œ๋‹ค.

 

 

์—๋ฆญ์—๋ฐ˜์Šค DDD ๋‚ด์šฉ์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์žˆ๋‹ค.

๋„๋ฉ”์ธ ๊ทœ์น™์„ ๊ฒฉ๋ฆฌํ•˜๋Š”๊ฒŒ ์ตœ์ข…๋ชฉํ‘œ์ด๋ฉฐ, ์•„ํ‚คํ…์ฒ˜๋Š” ๊ทธ ๋ชฉํ‘œ๋ฅผ ์‹คํ˜„์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํŒจํ„ด ํ˜น์€ ๊ตฌ์กฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

Concentrate all the code related to the domain model in one layer and isolate it from the user interface, application, and infrastructure code.

The key goal here is isolation. Related patterns, such as “Hexagonal Architecture,” may serve as well or better to the degree that they allow our domain model expressions
to avoid dependencies on and references to other system concerns.

 

 

๊ด€๋ จ์ž๋ฃŒ

Posted by doubler
,