base

(์ˆ˜๊ฐ• ๊ฐ•์˜ - ํŒจ์ŠคํŠธ์บ ํผ์Šค, The RED : ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ๊ณต์„ ์œ„ํ•œ Java/Spring ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๊ฐœ๋ฐœ๊ณผ MSA ๊ตฌ์ถ• by ์ดํฌ์ฐฝ)

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

๋จผ์ € ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„, DDD๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์œผ๋กœ ๊ฐ„๋žตํ•˜๊ฒŒ ์†Œ๊ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

DDD-layer2

๊ตฌ๊ธ€์—๋Š” DDD์— ๋Œ€ํ•ด ๋ณต์žกํ•˜๊ฒŒ ์„ค๋ช…ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๋งŽ์€๋ฐ ์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์ •๋ง ๊น”๋”ํ•˜๋‹ค... DDD๋Š” interfaces, application, domain, infrastructure ์ด๋ ‡๊ฒŒ ํฌ๊ฒŒ 4๊ฐ€์ง€ ๊ณ„์ธต์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

interface๋Š” controller, dto๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ  infrastructure์—๋Š” db๋ ˆ๋ฒจ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ์กด์žฌํ•œ๋‹ค. db๋ ˆ๋ฒจ์˜ ๊ตฌํ˜„์ฒด๋ผ ํ•จ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ spring data jpa๊ฐ€ ์žˆ๊ฒ ๋‹ค. interface๋ฅผ ์„ ์–ธํ•˜๋ฉด jpa์—์„œ ์•Œ์•„์„œ ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด application๊ณผ domain์€ ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ• ๊นŒ? ์‚ฌ์‹ค ๊ทธ๋ƒฅ ๊ทธ๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋„ ๋˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๊ฐ€ ๋‚ด๊ฐ€ ์ด์ „์— ์•Œ๊ณ  ์žˆ๋˜ ์Šคํ”„๋ง ์›น ๊ณ„์ธต ๋•Œ๋ฌธ์ด๋‹ค. ์Šคํ”„๋ง ์›น ๊ณ„์ธต๊ณผ DDD๋Š” ์–ด๋–ป๊ฒŒ ๋น„๊ตํ•  ์ง€ ๋ถ„์„์ด ํ•„์š”ํ•˜๋‹ค.

spring-web-layer

๋จผ์ € ์Šคํ”„๋ง ์›น ๊ณ„์ธต์˜ web layer์™€ repository layer๋Š” DDD 4๊ณ„์ธต์˜ interface์™€ infrastructure์™€ ์ƒ์‘ํ•œ๋‹ค. ๋‹ค์Œ์œผ๋กœ, dto๋Š” DDD์˜ interface, ์›น ๊ณ„์ธต์˜ web layer์— ์กด์žฌํ•˜์ง€๋งŒ, dto๋ฅผ ๋‹ค๋ฅธ ๊ณ„์ธต์—๋„ ์ „๋‹ฌํ•˜๋ฏ€๋กœ ์›น ๊ณ„์ธต์˜ ์šฐ์ธก ์ƒ๋‹จ์— ์œ„์น˜ํ•œ ๊ฒƒ์ด ์ดํ•ด๋œ๋‹ค. ๋‚จ์€ ์Šคํ”„๋ง ์›น ๊ณ„์ธต์˜ service layer, domain model๋Š” ์–ด๋–ป๊ฒŒ ๋งค์นญ ์‹œ์ผœ์•ผ DDD์˜ application, domain layer์— ๋งค์นญ๋  ์ˆ˜ ์žˆ์„๊นŒ?

๋‚˜์˜ ๊ฒฐ๋ก ์€ ์›น ๊ณ„์ธต์˜ service layer์™€ domain model, DDD์˜ application๊ณผ domain layer๊ฐ€ ๊ณตํ†ต์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ด '์ถ”์ƒํ™”'๋ผ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ถ”์ƒํ™”๋ผ ํ•จ์€ ์ถ”์ƒํ™”๋ฅผ ์‹œ์ผœ์„œ domain์— ์˜์กดํ•˜๋Š” ๊ฒƒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”๋„ domain์˜ ๋กœ์ง์€ ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ์‹œ๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์•„์ ธ db๋ฅผ mariadb์—์„œ mongodb๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ์ƒํ™ฉ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ ๊ทธ ์ƒํ™ฉ์—์„œ spring data jpa์—์„œ spring data mongodb๋กœ ์˜์กด์„ฑ๋งŒ ๊ต์ฒดํ•ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋กœ์ง์˜ ์ถ”์ƒํ™”๊ฐ€ ๋œ๋‹ค๋ฉด db๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ ๋„๋ฉ”์ธ์˜ ๋กœ์ง์„ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ์— ๋”ฐ๋ผ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง€๋Š” ๊ฒƒ์€ ๋ค์ด๊ณ  ๋ง์ด๋‹ค.

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

์Šคํ”„๋ง ์›น ๊ณ„์ธต๊ณผ DDD๋ฅผ ํ†ตํ•ฉํ•ด ์ •๋ฆฌํ•œ ํ•ต์‹ฌ ๊ฐœ๋…์€ **'domain๋กœ์ง์˜ ์ถ”์ƒํ™”'**์ด๋‹ค.

Last updated