๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ›๏ธ Architecture

Layered & Domain Architecture ๋ž€ ๋ฌด์—‡์ผ๊นŒ?

by GroovyArea 2022. 5. 3.
์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋„์ค‘ ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ๊ณผ์ •์—์„œ ์˜์™ธ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. ๊ธฐ์กด์— ๋งŒ๋“ค์—ˆ๋˜ ์›น ํ”„๋กœ์ ํŠธ๋Œ€๋กœ Controller & Service & Domain & Repository ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ๋ถ„๋ช…ํžˆ ์„ค๊ณ„ ๊ธฐ์ค€์ด ์žˆ์„ ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์•„๋‹ˆ๋‚˜ ๋‹ค๋ฅผ๊นŒ DDD์ด๋“  Layered ์ด๋“  ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฒˆ ๊ธฐํšŒ์— ์ƒ์„ธํžˆ ์ •๋ฆฌํ•ด์„œ ํ”„๋กœ์ ํŠธ์— ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์šฉ์‹œ์ผœ๋ณผ ์ƒ๊ฐ์ด๋‹ค.

 

์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜(Software Architecture) ๋ž€?

-> ๋ง ๊ทธ๋Œ€๋กœ ๊ตฌ์กฐ์ด๋‹ค.

-> ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ฐ€์ง„ ํŠน์„ฑ ์ค‘ ์™ธ๋ถ€์— ๋“œ๋Ÿฌ๋‚˜๋Š” ํŠน์„ฑ, ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์‹œ์Šคํ…œ ๊ตฌ์กฐ๋‚˜ ๊ตฌ์กฐ์ฒด

 

๋ชจ๋“ˆ

-> ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ž‘์€ ๊ธฐ๋Šฅ ํ•˜๋‚˜์˜ ๋‹จ์œ„

 

์ปดํฌ๋„ŒํŠธ

-> ๋ชจ๋“ˆ์„ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฌถ์–ด ๋†“์€ ์ง‘ํ•ฉ

 

=> ์ด ์ „์ฒด๋ฅผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์ด์ œ ๊ธฐ๋ณธ์ ์ธ ์šฉ์–ด๋“ค์„ ์•Œ์•„ ๋ณด์•˜์œผ๋‹ˆ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜์˜ ๊ฐœ๋…์„ ์‚ดํŽด๋ณด์ž

 

Layered Architecture

> ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(Seperation of concerns)์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์„ ์œ ์‚ฌํ•œ ์ฑ…์ž„(๊ด€์‹ฌ)์„ ์ง€๋‹Œ Layer๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ์˜ Layer๊ฐ€ ํ•˜์œ„ Layer์—๋งŒ ์˜์กดํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ์•„ํ‚คํ…์ณ ํŒจํ„ด

 

๋ชฉ์ 

> ๊ฐ ๋ ˆ์ด์–ด๋“ค์ด ํŠน์ • ๊ด€์‹ฌ์‚ฌ์™€ ๊ด€๋ จ๋œ ๊ฐœ์ฒด๋งŒ์„ ํฌํ•จํ•˜๋„๋ก ํ•จ

> ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถค

> ๊ฐœ๋ฐœ์ž์˜ ์ธ์ง€ ๊ณผ๋ถ€ํ•˜ ๋ฐฉ์ง€

> ์ด๋กœ ์ธํ•œ ์žฌ์‚ฌ์šฉ์„ฑ & ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

 

๊ณ„์ธต

  • Presentation layer : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ๋‹ด๋‹น
  • Application layer : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ๋ฆ„์„ ์ œ์–ด
  • Domain layer : ๋„๋ฉ”์ธ์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ํฌํ•จ
  • Infrastructure layer : ์ƒ์œ„ ๊ณ„์ธต์„ ์ง€์›

๋‹จ์ 

  • ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ํด ์ˆ˜๋ก ํ™•์žฅ์„ฑ์ด ๋–จ์–ด์ง
  • ๋ถ„๋ฆฌ๋œ ๊ด€์‹ฌ์‚ฌ ์™ธ์— ๋‹ค๋ฅธ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌ ๋ฐ ์ฝ”๋“œ ๋ฐฐ์น˜๊ฐ€ ์–ด๋ ค์›Œ์ง
  • ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์„ฑ๋Šฅ์  ์ด์ ์„ ์–ป๊ธฐ๊ฐ€ ์–ด๋ ค์›€

์ ์šฉํ•˜๊ธฐ ์ข‹์€ ์˜ˆ

  • ํ”„๋กœ์ ํŠธ ๋„๋ฉ”์ธ์ด ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ํ™•์žฅ์„ฑ๋ณด๋‹ค๋Š” ์ผ๊ด€์„ฑ์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ธ ๊ฒฝ์šฐ
  • ์†Œ๊ทœ๋ชจ๋กœ ๊ตฌ์„ฑ๋œ ํŒ€์ธ ๊ฒฝ์šฐ

ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ์˜ˆ์‹œ ๋‚ด๊ฐ€ ํ•œ ๋ฐฉ์‹๊ณผ ํก์‚ฌํ•˜๋‹ค.

=> ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ๋‹จ๊ณ„์—์„œ๋Š” ์ด ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒŒ ์•Œ๋งž๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋‹ค.

 

Domain Driven Development

> ๋„๋ฉ”์ธ์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ

 

๋„๋ฉ”์ธ์ด๋ž€?

> ์‹ค์„ธ๊ณ„์—์„œ ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ•˜๋Š” ์ง‘ํ•ฉ

> ex ) ์˜ท ์‡ผํ•‘๋ชฐ : [์ฃผ๋ฌธํ•˜๋Š” ๋„๋ฉ”์ธ, ์˜ท์„ ๊ด€๋ฆฌํ•˜๋Š” ๋„๋ฉ”์ธ, ๊ฑด๋ฌผ ๊ด€๋ฆฌ ๋„๋ฉ”์ธ ๋“ฑ๋“ฑ๋“ฑ]

 

์ด๋Ÿฌํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋„๋ฉ”์ธ๋“ค์ด ์„œ๋กœ ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋ฉฐ, ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„

 

ํŠน์ง•

> ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ์˜์—ญ์— ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ์œ„ํ•ด์„œ๋Š” API๋กœ ํ˜ธ์ถœํ•ด์•ผํ•จ

> ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ์€ ์„œ๋กœ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌ

> ์ด๋กœ ์ธํ•œ ๋†’์€ ์‘์ง‘๋ ฅ๊ณผ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋กœ ๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์— ์šฉ์ดํ•œ ์„ค๊ณ„๋ฅผ ์ด๋ฃธ

 

Domain Layer

> Entity (๊ณ ์œ  ์‹๋ณ„์ž [PK]๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ์ฒด์˜ ์ •์ฒด์„ฑ ๋ถ€์—ฌ), VO (์ƒํƒœ [Attribute] ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ์ฒด์˜ ์ •์ฒด์„ฑ ๋ถ€์—ฌ) ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„๋ฉ”์ธ ๋กœ์ง์ด ์ง„ํ–‰๋˜๋Š” ๊ณ„์ธต 

๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ ์˜ˆ์‹œ

์ ์šฉํ•˜๊ธฐ ์ข‹์€ ์˜ˆ

  • ํ”„๋กœ์ ํŠธ ๋„๋ฉ”์ธ์ด ๋ณต์žกํ•œ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ๊ฒฝ์šฐ
  • ํ™•์žฅ์„ฑ์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ธ ๊ฒฝ์šฐ
  • ๋Œ€๊ทœ๋ชจ๋กœ ๊ตฌ์„ฑ๋œ ํŒ€์ธ ๊ฒฝ์šฐ

 

๋‚˜์˜ ํ”„๋กœ์ ํŠธ์—๋Š” ์–ด๋–ค ์•„ํ‚คํ…์ณ๋ฅผ ์ ์šฉ ์‹œํ‚ค๋Š”๊ฒŒ ์ข‹์„๊นŒ?

> ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ์ด์–ด ์•„ํ‚คํ…์ณ์˜ ๊ฐœ๋…์„ ๊ณต๋ถ€ํ•œ ๊ฒฐ๊ณผ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ๊ฐ™์€ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋Š” application layer ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ณ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ ธ๋‹ค.

> ๋Œ€๊ทœ๋ชจ์„ฑ ํ™•์žฅ์„ฑ์„ ๋ˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— DDD๋Š” ๋‚˜์ค‘์— ํšŒ์‚ฌ์—์„œ ๊ฒฝํ—˜์„ ํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.

 

์ฐธ๊ณ : https://moo-you.tistory.com/218

 

์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜(Software Architecture) ๋ž€?

์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜(Software Architecture) ๋ž€? ๊ฐœ๋…์  ์˜๋ฏธ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ์š”์†Œ์™€ ๊ทธ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๊ฐ€์ง„ ํŠน์„ฑ ์ค‘ ์™ธ๋ถ€์— ๋“œ๋Ÿฌ๋‚˜๋Š” ํŠน์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์‹œ์Šคํ…œ ๊ตฌ

moo-you.tistory.com

์ฐธ๊ณ : https://huisam.tistory.com/entry/DDD

 

DDD(Domain Driven Design) - ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋ž€? ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๊ด€์ ์—์„œ

๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋ถ€ํ„ฐ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์„ ๋จผ์ € ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ์˜ ํ•ต์‹ฌ์€ ๋ญ˜๊นŒ์š”? ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ์˜ ํ•ต์‹ฌ์€ ์‹ค์„ธ๊ณ„์˜ ๊ฐ์ฒด(๋ฌผ๊ฑด, ์‚ฌ๋žŒ, ์ฃผ๋ฌธ ....

huisam.tistory.com

์ฐธ๊ณ : https://happycloud-lee.tistory.com/94

 

DDD ํ•ต์‹ฌ๋งŒ ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ธฐ

์ฐธ๊ณ : https://steemit.com/kr/@frontalnh/domain-driven-design ์œ„ ๊ธ€์€ Eric Evans์˜ '๋„๋ฉ”์ธ๊ธฐ๋ฐ˜๋””์ž์ธ'์„ ๋ฒˆ์—ญํ•œ ๊ธ€์ธ๋“ฏ ํ•œ๋ฐ ์ง์—ญํ•˜๋‹ค ๋ณด๋‹ˆ ์˜๋ฏธ๊ฐ€ ์ž˜ ์ „๋‹ฌ ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด ์ œ ๋‚˜๋ฆ„๋Œ€๋กœ ์žฌํ•ด์„ํ•˜์˜€์Šต๋‹ˆ๋‹ค..

happycloud-lee.tistory.com

 

๋ฐ˜์‘ํ˜•