ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋ž€?

2026. 1. 3. 16:08ใ†Backend

๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

 

 

ํ•ต์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ๊ฐœ๋…

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

 

 

๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์˜ ๋ฌธ์ œ์ 

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์˜์†์„ฑ์— ๋Œ€ํ•œ ์˜์กด์„ฑ
    1. ๋„๋ฉ”์ธ ๊ณ„์ธต์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กดํ•˜๊ฒŒ ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋„๋ฉ”์ธ ๊ณ„์ธต์—๋„ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด๋‹ค.
      ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ๋„ ์˜์†์„ฑ ๋ชจ๋ธ์„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
    2. ์ฆ‰์‹œ๋กœ๋”ฉ, ์ง€์—ฐ๋กœ๋”ฉ, ํŠธ๋žœ์žญ์…˜ ๋“ฑ์„ ๊ณ ๋ คํ•ด์•ผํ•˜๊ณ  ์˜์†์„ฑ์— ๋Œ€ํ•œ ์˜์กด์ด ํ”„๋กœ์ ํŠธ ์ „์ฒด์ ์œผ๋กœ ํผ์ง€๊ฒŒ ๋˜์–ด ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•ด์ง„๋‹ค.
  2. ์•„ํ‚คํ…์ฒ˜ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์—†๋‹ค.
    1. ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์ƒ์œ„ ๊ณ„์ธต์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์— ์ ‘๊ทผํ•  ๋ชฉ์ ์œผ๋กœ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜์œ„ ๊ณ„์ธต์œผ๋กœ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    2. ์ด๋Ÿฌํ•œ ํ–‰์œ„๊ฐ€ ๋ฐ˜๋ณต๋˜๋ฉด ์ ์  ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•ด์ง€๊ณ  ํ—ˆ๋ฌผ์–ด์ง€๊ฒŒ ๋œ๋‹ค. 
  3. ๊ณ„์ธต์„ ์Šคํ‚ต ํ•  ์ˆ˜ ์žˆ๋‹ค.
    1. ๊ณ„์ธต์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    2. ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ Controller์—์„œ ๋ฐ”๋กœ ๋„๋ฉ”์ธ์„ ์ฐธ์กฐํ•˜๋Š” ๋“ฑ์˜ ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ๋Š” ๊ธฐ๋Šฅ ํ™•์žฅ์ด ์–ด๋ ต๊ณ , ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. 
  4. ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์ˆจ๊ธด๋‹ค.
    1. ๊ฐœ๋ฐœ์ž๋Š” ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์–ด๋А ๊ณ„์ธต์—๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    2. ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ์Šค์ผ€์ด์Šค์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ ๋™์ผํ•œ ๋กœ์ง์„ ๋‹ค๋ฅธ ์œ„์น˜์— ์ƒˆ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋”๋Ÿฝํžˆ๊ฒŒ ๋œ๋‹ค. 
  5. ์„œ๋น„์Šค์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ•์ œํ•  ์ˆ˜ ์—†๋‹ค.
    1. ๊ณ„์ธตํ˜• ๊ตฌ์กฐ์—์„œ๋Š” ์„œ๋น„์Šค์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ•์ œํ•˜์ง€์•Š๋Š”๋‹ค. ์ˆ˜์‹ญ๊ฐœ์˜ ์„œ๋น„์Šค ๋กœ์ง์„ ํ•œ๊ณณ์— ์ „๋ถ€ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
    2. ์ด ๊ฒฝ์šฐ์— ์„œ๋น„์Šค๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์˜์กด์„ ๊ฐ€์ ธ ์ˆ˜๋งŽ์€ ์›น ๊ณ„์ธต์ด ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ตญ ์„œ๋น„์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ณ  ์ž‘์—…ํ•ด์•ผํ•  ์œ ์Šค์ผ€์ด์Šค๋ฅผ ์ฐพ๊ธฐ๋„ ํž˜๋“ค์–ด์ง„๋‹ค.

 

 

 

 

 

ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜์™€ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์™€ ์—ฐ๊ด€๊ด€๊ณ„

  1. ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์˜ ๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.
  2. ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜์™€ DDD๋Š” ์„œ๋กœ ๋ณด์™„์ ์ธ ๊ด€๊ณ„์— ์žˆ๋‹ค.
  3. DDD๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ ์ค‘์‹ฌ์œผ๋กœ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ณ , ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋Š” ์ด๋Ÿฌํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  4. DDD ๊ตฌํ˜„์˜ ํ•ต์‹ฌ 3๊ฐ€์ง€ Layer
    1. Application Layer: ์ฃผ๋กœ ๋„๋ฉ”์ธ๊ณผ Repository๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ์„œ๋น„์Šค(API)๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ณ„์ธต
    2. Domain Model Layer: Entity๋ฅผ ํ™œ์šฉํ•ด ๋„๋ฉ”์ธ ๋กœ์ง(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ณ„์ธต
    3. Infrastructure Layer: ์™ธ๋ถ€์™€ ํ†ต์‹ (RDBMS, Redis, HttpClient, ...)์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต

 

์ฃผ์š” ์ปดํฌ๋„ŒํŠธ

 

Adapter

  • ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ธํ”„๋ผ์™€ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ์˜๋ฏธ
  • ์ธํ”„๋ผ๋‚˜ web๊ณผ ๊ฐ™์€ ์ €์ˆ˜์ค€ layer๋“ค์ด ๋„๋ฉ”์ธ ๋กœ์ง์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํฌํŠธ๋ฅผ ์‚ฌ์šฉ
์ด๋ฆ„ ์„ค๋ช… ์˜ˆ์‹œ
Driving Adapter 
= Primary Adapter
์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ผ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Adapter
  • AWS Lambda์˜ Handler
  • WebApplication์˜ Controller(UI)
  • adapter, application์„ ๋™์ž‘์‹œํ‚ค๋Š”(Driving) ์—ญํ• .
  • ์ธ๋ฐ”์šด๋“œ ํฌํŠธ ์‚ฌ์šฉ
  • ์‚ฌ์šฉ์ž ์š”์ฒญ → Controller → [Input Port] → Application
Driven Adapter 
= Secondary Adapter
๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋˜๋Š” Adapter
  • MessageQueue
  • Persistence Adapter
  • application์— ์˜ํ•ด ๋™์ž‘๋˜๋Š”(Driven) ์—ญํ• .
  • ์ฃผ๋กœ ์ธํ”„๋ผ์™€ ์—ฐ๊ฒฐ๋˜๋Š” ์—ญํ• .
  • ์•„์›ƒ๋ฐ”์šด๋“œ ํฌํŠธ ์‚ฌ์šฉ
  • Application → [Output Port] → DB/์™ธ๋ถ€API

 

 

 

Port

  • ์„œ๋น„์Šค(๋˜๋Š” usecase)์— ์–ด๋Œ‘ํ„ฐ์— ๋Œ€ํ•œ ๋ช…์„ธ๋งŒ์„ ์ œ๊ณตํ•˜๋Š” ๊ณ„์ธต
  • ๋‹จ์ˆœํžˆ ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋งŒ ์กด์žฌํ•˜๋ฉฐ, DI๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
  • Port๋Š” application ์ž…์žฅ์—์„œ consumer, ๋˜๋Š” application์—์„œ ๋‚˜๊ฐ€๊ฑฐ๋‚˜/๋“ค์–ด์˜ค๋Š” end point๋ผ๊ณ  ๋ณด๋ฉด ๋จ.
  • ํฌํŠธ๋Š” ๋‚ด๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ์˜์—ญ์„ ์™ธ๋ถ€ ์˜์—ญ์— ๋…ธ์ถœํ•œ API์ด๊ณ  ์ธ๋ฐ”์šด๋“œ(Inbound)/์•„์›ƒ๋ฐ”์šด๋“œ(Outbound) ํฌํŠธ๋กœ ๊ตฌ๋ถ„
    • ์ธ๋ฐ”์šด๋“œ ํฌํŠธ - ๋‚ด๋ถ€ ์˜์—ญ ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋…ธ์ถœ๋œ API
    • ์•„์›ƒ๋ฐ”์šด๋“œ ํฌํŠธ - ๋‚ด๋ถ€ ์˜์—ญ์ด ์™ธ๋ถ€ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ API

 

Application Service(usecase)

  • ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ฃผ์ž… ๋ฐ›์•„ ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ ์ ˆํžˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๋Š” ๊ณ„์ธต์„ ์˜๋ฏธ

 

Domain Model

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

 

 

ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜ ์žฅ๋‹จ์ 

์žฅ์ 

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

 

๋‹จ์ 

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

 

 

 

๋ฐ˜์‘ํ˜•