๐Ÿ‘ท๐Ÿป Architecture

4ํŽธ. Micro Service ๋‚ด๋ถ€๋ฅผ ์ง€ํƒฑํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ (Layered, Clean, Hexagonal)

DevPoong 2024. 4. 7. 15:53

Layerd, Clean, Hexagonal๊ณผ ๊ฐ™์ด Micro Service ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ์–˜๊ธฐํ•ด๋ณด๊ณ ,
๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—์„œ๋Š” Hexagonal Architecture์— ๋Œ€ํ•œ ์ƒ๊ฐ๊ณผ ์ปค์Šคํ…€ํ•˜๊ฒŒ ์‚ฌ์šฉํ–ˆ๋˜ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋„ ์–˜๊ธฐํ•ด๋ณด๊ฒ ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์™œ ๋ถ„๋ฆฌํ•ด์•ผ ํ• ๊นŒ?

์šฐ์„ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ Process Rule, Flow, Concept ์„ธ ๊ฐ€์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์šฉ์–ด์ด๋‹ค.

 

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

 

ํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ์ง€๊ธˆ ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋งŒ ํ•˜๋”๋ผ๋„ POJO Plain ํ•œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ง€ํ–ฅํ•˜๊ณ  ์ฒ ์ €ํ•˜๊ฒŒ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•์กฐํ•˜๋Š” Spring Framework์˜ ์ฒ ํ•™์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์ฑ„, ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด SQL ๋ฌธ์— ๋“ค์–ด์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ œ๋Œ€๋กœ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ–์ถ˜ Entity๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ , ์„œ๋น„์Šค์™€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์กด์žฌํ•˜๊ธฐ๋Š” ํ•˜๋‚˜ ๊ทธ์ € Flow๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์ƒ‰๋งŒ ๊ฐ–์ถ”์–ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

 

๋ฌธ์ œ

1. Java๋กœ ๊ตฌํ˜„๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฝ๋Š” ๊ฒƒ๊ณผ, SQL๋กœ ์ด๋ฃจ์–ด์ง„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋‹ด๊ธด ์ฟผ๋ฆฌ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ๋‚œ์ด๋„๊ฐ€ ํ™•์‹คํžˆ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

2. ๋‚˜์ค‘์— ๋น„์ง€๋‹ˆ์Šค Rule์ด ๋ณ€๊ฒฝ๋˜์–ด ๋ณ€๊ฒฝํ•˜๋ผ๋Š” ์š”์ฒญ์ด ๋‚ด๋ ค์˜ค๋ฉด ์ œ๋Œ€๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์—†๋‹ค.. ๊ทธ๋ƒฅ ์—†๋‹ค.

3. RDB์—์„œ ์ฝ๊ธฐ์— ์ตœ์ ํ™”๋œ NoSQL๋กœ ๋ณ€๊ฒฝํ•˜๋ ค ํ•  ๋•Œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. 

4.DB์— ๋„ˆ๋ฌด ๋งŽ์ด ์ฑ…์ž„์„ ๋ถ€์—ฌํ•˜๊ฒŒ ๋˜์–ด ๊ณผ๋ถ€ํ•˜๋กœ ์ธํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์•„๋ฌด๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์Šค์ผ€์ผ ์•„์›ƒํ•˜๋”๋ผ๋„ DB๊ฐ€ ๋ฐ”์˜๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

 

 

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๋งํ•ด๋„, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์™œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๊ฒŒ ๋œ๋‹ค.

 

 

Layered Architecture - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ 1

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

๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜๋ž€ Web, Domain, Persistence๋ฅผ ์œ„ํ•œ ๊ณ„์ธต์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
๋‹ค๋ฅด๊ฒŒ๋Š”, Presentation, Business Logic, Data Access ๊ณ„์ธต์œผ๋กœ ๋งํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

  • Web ๊ณ„์ธต : ํ™”๋ฉด๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ•˜๋Š” ๊ณ„์ธต
  • Domain ๊ณ„์ธต : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  Flow๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ณ„์ธต
  • Persistence ๊ณ„์ธต : DB์™€ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ์˜ CRUD๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ„์ธต

 

ํ•˜์ง€๋งŒ, ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์—๋Š” ๋ฌธ์ œโ—๏ธ๊ฐ€ ์žˆ๋‹ค.

ํ•˜์œ„๊ณ„์ธต์ด ๋ฌด์—‡์ธ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ํ™•์žฅ๋  ๋•Œ, ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•  ์ƒ์œ„ ๊ณ„์ธต์ด ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ํ•˜์œ„๊ณ„์ธต์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Persistence ๊ณ„์ธต์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ Domain ๊ณ„์ธต์ด ๋ณ€๊ฒฝ๋˜๋ฉด OCP ์›์น™์„ ์œ„๋ฐฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก , Persistence ๊ณ„์ธต์˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋งŒ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์œผ๋กœ๋Š” Domain ๊ณ„์ธต์— ์˜ํ–ฅ์ด ์—†์„ ๊ฒƒ์ด๋‹ค. 
ํ•˜์ง€๋งŒ, Domain ๊ณ„์ธต์—์„œ ์˜์กดํ•˜๋Š” Persistence ๊ณ„์ธต์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์˜ํ–ฅ์„ ๋ฐ›์„ ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ฒƒ์ด๋‹ค.

 

 


Web๊ณผ Persistence ๊ณ„์ธต์€ ์ €์ˆ˜์ค€ ์˜์—ญ์ด๊ณ ,  Domain ๊ณ„์ธต์€ ํ•ต์‹ฌ ์˜์—ญ์ธ ๊ณ ์ˆ˜์ค€ ์˜์—ญ์œผ๋กœ ๋ณดํ˜ธ๋ฐ›์•„์•ผ ๋งˆ๋•…ํ•˜๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ๋งํ•ด๋ณด๊ฒ ๋‹ค.

 

Layered Architecture์˜ OCP ์œ„๋ฐฐ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด๊ณ  ์–ด๋Š ์ •๋„ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

Persistence ๊ณ„์ธต์—์„œ ์กด์žฌํ•˜๋˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Domain ๊ณ„์ธต์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ DIP ์˜์กด์„ฑ ์—ญ์ „ ๋ฒ•์น™์„ ์ ์šฉํ•œ ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด, Repository ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Domain ๊ณ„์ธต์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜คํžˆ๋ ค Persistence ๊ณ„์ธต์—์„œ Domain ๊ณ„์ธต์— ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.
๋”ฐ๋ผ์„œ, ์ €์ˆ˜์ค€ ๊ณ„์ธต์—์„œ์˜ ๋ณ€๊ฒฝ์ด ๊ณ ์ˆ˜์ค€ ๊ณ„์ธต์œผ๋กœ ์ „์ด๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.

 

์•„๋ž˜ ์‚ฌ์ง„์€ ์ด์ „์— ์ง„ํ–‰ํ–ˆ๋˜ ์˜ˆ์•ฝ์‹œ์Šคํ…œ Repository Interface์ด๊ณ , DIP๋ฅผ ์ ์šฉํ•˜์—ฌ domain ์˜์—ญ์— ์กด์žฌํ•œ๋‹ค.

 

์ด๋ฒˆ์—๋Š”, Repository ๊ตฌํ˜„์ฒด๋กœ domain ์˜์—ญ๊ณผ ๋ถ„๋ฆฌ๋œ persistence ์˜์—ญ์— ์กด์žฌํ•œ๋‹ค. 

 

 

์ง€๊ธˆ๊นŒ์ง€, SOLID์—์„œ OCP์™€ DIP๋ฅผ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ์˜€๋‹ค.

 

 

Clean Architecture - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ 2

๊ทธ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠผ C. ๋งˆํ‹ด์ด ์ œ์•ˆํ•œ ์•„ํ‚คํ…์ฒ˜์ด๋‹ค.

 

์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด๊ฐ€ ๊ฒน์ณ์ ธ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ค‘์•™์—์„œ๋ถ€ํ„ฐ ์—”ํ‹ฐํ‹ฐ, ์œ ์Šค์ผ€์ด์Šค, ๊ธฐํƒ€ ์™ธ๋ถ€(Controller, Gateway, Web, DB, External Interface) ๊ณ„์ธต์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ๋งŒ ์˜์กด์„ฑ ๋ฐฉํ–ฅ์ด ํ๋ฅด๊ฒŒ ๋œ๋‹ค.

 

์•ˆ์—์„œ๋ถ€ํ„ฐ ๋ฐ–์œผ๋กœ ๊ฐ ๊ณ„์ธต์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

 

Entity ๊ณ„์ธต 

๊ฐ€์žฅ ๊ณ ์ˆ˜์ค€์˜ ์˜์—ญ์œผ๋กœ, ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ฐ€์žฅ ๋‚ด๋ถ€์— ๊ณ ์ˆ˜์ค€ ์˜์—ญ์ด ์กด์žฌํ•œ๋‹ค.

 

์ค‘์•™์—๋Š”, ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ–ˆ์—ˆ๋˜ ์„œ๋น„์Šค์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์—…๋ฌด ๊ทœ์น™์„ ๋‹ค๋ฃจ๋Š” Entity ๊ณ„์ธต์ด ์กด์žฌํ•œ๋‹ค.
์ฃผ๋ณ€์— ์žˆ๋Š” Use Case ๊ณ„์ธต์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋„๋ฉ”์ธ Entity๋“ค์ด ์กด์žฌํ•œ๋‹ค.

 

์—”ํ‹ฐํ‹ฐ ๊ณ„์ธต์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฐ์ฒด๋กœ ์กด์žฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ORM๊ณผ ๊ด€๋ จ๋œ ํ”„๋ ˆ์ž„์›Œํฌ๋‚˜ ๊ธฐํƒ€ ๋ณต์žกํ•œ ๊ฒƒ๋“ค๊ณผ๋Š” ๊ด€๋ จ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

 

Use Case ๊ณ„์ธต

Entity ๊ณ„์ธต์„ ๊ฐ์‹ธ๊ณ  ์žˆ์œผ๋ฉฐ, ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” Service๋ผ๊ณ  ๋ถˆ๋ €๋˜ ๊ฒƒ๋“ค์ด๋‹ค.
Use Case๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋Š” SRP ์›์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์œ ์Šค์ผ€์ด์Šค๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋ผ๊ณ  ํ•œ๋‹ค.

 

ํ•ด๋‹น ๊ณ„์ธต์—์„œ๋Š” Entity ๊ณ„์ธต ๋‚ด๋ถ€์˜ ์„œ๋น„์Šค์˜ ๋น„์ฆˆ๋‹ˆ์Šค ์—…๋ฌด ๊ทœ์น™์„ ํ˜ธ์ถœํ•˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠนํ™”๋œ ์—…๋ฌด ๊ทœ์น™์„ ํ‘œํ˜„ํ•œ๋‹ค.

 

 

๊ธฐํƒ€ ๊ณ„์ธต

Use Case ๊ณ„์ธต์„ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ๋‚˜๋จธ์ง€ ๊ธฐํƒ€ ๊ณ„์ธต์„ ์˜๋ฏธํ•œ๋‹ค.

Controller๋ถ€ํ„ฐ Gateway, Web, ์™ธ๋ถ€ Interface, DB์™€ ๊ด€๋ จ๋œ ๊ฒƒ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

 

ํ•ด๋‹น ๊ณ„์ธต์—์„œ Use Case ๊ณ„์ธต๊ณผ์˜ ๊ด€๊ณ„๋ฅผ DIP ์˜์กด ์—ญ์ „ ๋ฒ•์น™์„ ์ด์šฉํ•ด์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ฒ˜๋Ÿผ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ๊นŒ์ง€๋งŒ ๋งํ•˜๋ฉด, ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ• ์ง€ ๋ชจํ˜ธํ•  ๊ฒƒ์ด๋‹ค. ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋กœ ์„ค๋ช…๋œ ์•„ํ‚คํ…์ฒ˜์ธ Hexagonal Architecture๋ฅผ ๋‹ค์Œ์œผ๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

 

Hexagonal Architecture - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ 3

ํด๋ฆฐ์•„ํ‚คํ…์ฒ˜์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๋“ค์„ ๋” ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋กœ ์„ค๋ช…ํ•œ ์•„ํ‚คํ…์ฒ˜์ด๋‹ค.

๊ทธ๋ฆผ์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, Port & Adapter ์•„ํ‚คํ…์ฒ˜๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

 

์ด ์•„ํ‚คํ…์ฒ˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณ ์ˆ˜์ค€ ์˜์—ญ๊ณผ, ์ธํ„ฐํŽ˜์ด์Šค ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ €์ˆ˜์ค€์˜ ์™ธ๋ถ€ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

 

๋‚ด๋ถ€ ์˜์—ญ์—๋Š” ์™ธ๋ถ€ ์˜์—ญ๊ณผ ์—ฐ๊ณ„๋˜๋Š” Input Port์™€ Output Port๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ,
์™ธ๋ถ€ ์˜์—ญ์€ ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Inbound Adapter์™€, ๋‚ด๋ถ€ ์˜์—ญ์—์„œ ํ˜ธ์ถœ๋˜์–ด ์™ธ๋ถ€์™€ ์—ฐ๊ณ„๋˜๋Š” Outbound Adapter๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

 

๋˜ํ•œ, ๋‚ด๋ถ€ ์˜์—ญ์—์„œ๋Š” Entity์™€ Use Case๊ฐ€ ์กด์žฌํ•˜๊ณ , ์™ธ๋ถ€ ์˜์—ญ๊ณผ ์—ฐ๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ Use Case Interface๊ฐ€ ์กด์žฌํ•œ๋‹ค. Use Case๊ฐ€ ์ด๋Ÿฌํ•œ Use Case Interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
์ถ”๊ฐ€์ ์œผ๋กœ, ๋‚ด๋ถ€ ์˜์—ญ์— ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค. DB ์ €์žฅ์†Œ์™€ ๊ด€๋ จ๋œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ Repository Interface์ด๋‹ค. Repository Interface๋ฅผ ๋‚ด๋ถ€ ์˜์—ญ์— ์ •์˜ํ•จ์œผ๋กœ์จ, ์™ธ๋ถ€ ์˜์—ญ์˜ ์ €์žฅ์†Œ ์–ด๋Œ‘ํ„ฐ๋Š” ํ•ด๋‹น Repository Interface๋ฅผ ๊ฐ ์ €์žฅ์†Œ์— ๋งž๊ฒŒ ๊ธฐ์ˆ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.



ํด๋ฆฐ์•„ํ‚คํ…์ฒ˜์™€ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฑฐ์˜ ๋™์ผํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๊ด€์‹ฌ์‚ฌ๋ผ๋ฆฌ ๋ถ„๋ฆฌํ•ด์„œ ์‘์ง‘์„ฑ์„ ๋†’์ด๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋ผ๋ฆฌ๋Š” ์˜์กด์„ฑ์„ ๋‚ฎ์ถ˜๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ค๋ฃจ๋Š” ์ฝ”์–ด ์˜์—ญ์„ ๊ธฐ์ˆ ๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • ๊ณ ์ˆ˜์ค€์˜ ์˜์—ญ์ด ์ €์ˆ˜์ค€์˜ ์˜์—ญ์— ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ, ๊ณ ์ˆ˜์ค€์ด๋ž€ ๋†’์€ ๊ณ„์ธต์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ค‘์š”๋„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • Web, DB, Message Queue ๋“ฑ ์ €์ˆ˜์ค€์˜ ์˜์—ญ์€ ๋ณ€๊ฒฝ์ด๋‚˜ ๊ต์ฒด์˜ ์—ฌ์ง€๋ฅผ ๋‘์–ด์•ผ ํ•œ๋‹ค.
  • ์ €์ˆ˜์ค€ ์˜์—ญ์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๊ณ ์ˆ˜์ค€ ์˜์—ญ์— ์žˆ๋Š” ์ž์‹ ์˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ฒŒ ํ•˜์—ฌ DIP ์˜์กด ์—ญ์ „์˜ ๋ฒ•์น™์„ ์ ์šฉ์‹œํ‚จ๋‹ค.

 

 

 

์•„๋ž˜๋Š” ๋‚ด๊ฐ€ Hexagonal Architecture๋ฅผ ์ ์šฉํ•˜๋ฉฐ, ์‚ฌ์šฉํ–ˆ๋˜ Package ๊ตฌ์กฐ์ด๋‹ค.

src.groupname
	ใ„ด global
    	ใ„ด config
        ใ„ด util
        ใ„ด error
        	ใ„ด exception
            	ใ„ด handler
    ใ„ด Aggregate Name
    	ใ„ด adapter
        	ใ„ด in
            		ใ„ด web
                		ใ„ด dto
                	ใ„ด consumer
            	ใ„ด out
            		ใ„ด persistence
                	ใ„ด producer
        ใ„ด domain
        ใ„ด application
        	ใ„ด port
            		ใ„ด in
                		ใ„ด dto
                	ใ„ด out
                		ใ„ด repository
            			ใ„ด producer
        	ใ„ด validator

ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ง€ํ–ฅํ•˜๋Š” ๋ฐ”๋ฅผ ๋Œ€๋ถ€๋ถ„ ๋‹ด๊ณ ์ž ํ–ˆ๊ณ , DIP ์›์น™์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด Service ๊ณ„์ธต์ธ application์—์„œ Output Port์— repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ค๋ฃจ๊ณ ์ž ํ–ˆ๋‹ค.

 

๋˜ํ•œ, ์ •ํ™•ํžˆ Hexagonal์˜ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ ์ž ํ•œ๋‹ค๋ฉด, domain ๊ณ„์ธต์—๋Š” ์ •ํ™•ํžˆ POJO Entity๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , Adapter์˜ Outbound Adapter ๋ถ€๋ถ„์—์„œ JPA๋ฅผ ์ ์šฉํ•œ Entity๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด ๋ถ€๋ถ„์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋น„์šฉ์ด ๋งŽ์ด ๋“ ๋‹ค. JPA๋ผ๋Š” ORM์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์ด ๋‚˜์—๊ฒŒ๋Š” ํ˜„์žฌ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ดœํ•œ ๊ณณ์— ๋น„์šฉ์„ ๋งŽ์ด ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š์•˜๋‹ค.

๋”ฐ๋ผ์„œ, ๋‚˜๋Š” domain ์ฝ”์–ด ๊ณ„์ธต์—์„œ ์ •์˜ํ•œ JPA Entity๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Entity๋กœ ์ƒ๊ฐํ•˜๊ณ  ์ •์˜ํ–ˆ๋‹ค.

 

๋ฌผ๋ก , ํ—ฅ์‚ฌ๊ณ ๋‚ ์—์„œ ๋งํ•œ ์ฝ”์–ด์—์„œ ๊ธฐ์ˆ ๊ณผ ์—ฐ๊ณ„๋˜๋Š” ๋ถ€๋ถ„์ด ์—†์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๋‚˜๋Š” ์ง€ํ‚ค์ง€ ์•Š์•˜์ง€๋งŒ, ๋‚˜๋Š” ์ด ๋ฐฉ๋ฒ•์ด ๋‚˜์—๊ฒŒ ํ˜„์žฌ ์ƒํ™ฉ์— ๋” ์ž˜ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์—ฌ๋Ÿฌ ์•„ํ‚คํ…์ฒ˜์˜ ์ข‹์€ ๋ถ€๋ถ„์„ ๋ฝ‘์•„์„œ ๋‚˜์˜  ํ˜„์žฌ ์ƒํ™ฉ์— ๋งž๋Š” ์•„ํ‚คํ…์ฒ˜๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

 

๋„๋ฉ”์ธ ๋ชจ๋ธ ํŒจํ„ด๊ณผ Aggregate - ๋‚ด๋ถ€์˜์—ญ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ

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

 

๋”ฐ๋ผ์„œ, ์œ„์™€ ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์Šคํฌ๋ฆฝํŠธ ํŒจํ„ด์€ ์ง€์–‘ํ•˜๊ณ  ๋„๋ฉ”์ธ ๋ชจ๋ธ ํŒจํ„ด์„ ์ง€ํ–ฅํ•ด์•ผ ํ•œ๋‹ค.

 

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

   

๋”ฐ๋ผ์„œ, ์„œ๋น„์Šค์˜ ์ฑ…์ž„์ด ์ค„์–ด๋“ค๊ณ  ๋„๋ฉ”์ธ์œผ๋กœ ์ฑ…์ž„์ด ๋ถ„์‚ฐ๋˜๊ธฐ์— ์„œ๋น„์Šค๋Š” ์—ฌ๋Ÿฌ ๋น„์ง€๋‹ˆ์Šค ๊ทœ์น™์„ ๊ฐ€์ง„ ๋„๋ฉ”์ธ์„ ์ด์šฉํ•˜์—ฌ ์—…๋ฌด ๊ทœ์น™๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

์—ฌ๊ธฐ์„œ, DDD (Domain Deriven Design)์˜ Aggregate ํŒจํ„ด์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์‹ค, ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ DDD๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋งŽ์€ ๋…ธ๋ ฅ์„ ํ–ˆ์œผ๋‚˜ ์™„๋ฒฝํ•˜๊ฒŒ ๋น„์ง€๋‹ˆ์Šค ๊ทœ์น™์„ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๊ณ„์†ํ•ด์„œ ๋„์ „ํ•˜๋ฉด์„œ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 

๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ž˜ ๋งŒ๋“ค๋ฉด ์ž์นซํ•˜๋ฉด ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์ค‘๋ณต ์ฝ”๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์„ ํ•ด๊ฒฐํ•˜๋ฉฐ ์ฝ”๋“œ์˜ ์–‘์„ ์ค„์ž„๊ณผ ๋™์‹œ์— ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋˜ํ•œ, Aggregate ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ 1 ๋Œ€ N ๊ด€๊ณ„์˜ ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ ์—ฐ๊ด€๋˜์–ด ๋„๋ฉ”์ธ์ด ์ปค์งˆ ๋•Œ N ์ธก์˜ ํด๋ž˜์Šค๊ฐ€ ์ˆ˜์ •๋˜๊ณ  1์ธก์—์„œ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ฒ˜๋Ÿผ ๋ฌธ์ œ๊ฐ€ ์ ์  ๊ผฌ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

Aggregate๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ธฐ์ค€์€ ๋‚˜๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ฐ™์ด ํ•˜๋Š” Object์™€ Value Object๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

 

๋˜ํ•œ, Aggregate์— ๋Œ€ํ•œ ๊ทœ์น™ ์ด ์žˆ๋‹ค.

  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” Root๋งŒ ์ฐธ์กฐํ•ด์•ผ ํ•œ๋‹ค.
  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด์˜ Object์— ์ง์ ‘ ์ฐธ์กฐํ•˜์ง€ ๋ง๊ณ  Root๋ฅผ ํ†ตํ•ด์„œ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋ฉฐ, ์ˆ˜์ •ํ•  ๋•Œ๋„ ๋™์ผํ•˜๋‹ค.
  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ„์˜ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋Š” PK ์ฐธ์กฐ๋ฅผ ํ•œ๋‹ค.  PK ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์–ด๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ„์— ๊ฒฐํ•ฉ๋„๊ฐ€ ๋Š์Šจํ•ด์ง„๋‹ค.
  • ์„œ๋น„์Šค์—์„œ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ๋Š” ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. 

 

 

์กฐ๊ธˆ๋งŒ ๋”

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

 

ํ•˜์ง€๋งŒ, "Micro Service๋ผ๊ณ  ๋ฌด์กฐ๊ฑด ์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ƒ?"๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ๊ทธ๊ฑด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ฉด ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋‚˜ ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์˜ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ ,
๊ฐ„๋‹จํ•˜๊ฑฐ๋‚˜ ์กฐํšŒ ๊ธฐ๋ฐ˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด๋„ ๋  ๊ฒƒ์ด๋‹ค.