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๋ผ๊ณ ๋ฌด์กฐ๊ฑด ์ด๋ฌํ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํด์ผ ํ๋?"๋ผ๊ณ ํ๋ค๋ฉด ๊ทธ๊ฑด ์๋๋ผ๊ณ ์๊ฐํ๋ค.
๋น์ฆ๋์ค ๋ก์ง์ด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฉด ํฅ์ฌ๊ณ ๋ ์ํคํ
์ฒ๋ ํด๋ฆฐ ์ํคํ
์ฒ์ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๊ณ ,
๊ฐ๋จํ๊ฑฐ๋ ์กฐํ ๊ธฐ๋ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ผ๋ฉด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํํด๋ ๋ ๊ฒ์ด๋ค.