๊ฐ์ฒด์งํฅ์์์ ํต์ฌ
์ ์ค์ธ๊ณ์ ๊ฐ์ฒด
(๋ฌผ๊ฑด, ์ฌ๋, ์ฃผ๋ฌธ, ... ์ฃผ๋์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์์ฐํ๋ ์ฃผ์ฒด)๋ค์ด
์๋ก ๊ฐ์ ์ํธ์์ฉ
์ ๋ฐํ์ผ๋ก ์ฑ
์, ํ๋ ฅ, ์ญํ
์ ๊ฐ์ง๊ณ ๋ฉ์์ง๋ฅผ ๊ตํํ๋ ๊ฒ
=> ๊ฒฐ๊ตญ ๊ฐ์ฒด(๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋๋ ์ฃผ์ฒด)
๊ฐ ํต์ฌ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๊ฐ์ฒด๋ค์ ์ด๋ป๊ฒ ํ๋ฉด ์ถ๋ ค๋ด๊ณ ,
์ด๋ป๊ฒ ํ๋ฉด ์ด๋ค ๊ฐ์ฒด๊ฐ ํ์ํ์ง ์ ์ ์๊ณ ,
์ด๋ป๊ฒ ํ๋ฉด ์ด ๊ฐ์ฒด๋ค์ด ์๋ก ์ํธ์์ฉ ํ ์ ์์๊น?
=> ํด๊ฒฐ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD)
์ด๋ค.
-
Domain-Driven Design ๋๋ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ
-
๋๋ฉ์ธ ํจํด์ ์ค์ฌ์ ๋๊ณ ์ค๊ณํ๋ ๋ฐฉ์
-
๋๋ฉ์ธ์
์ค์ธ๊ณ์์ ์ฌ๊ฑด์ด ๋ฐ์ํ๋ ์งํฉ
์ด์์ํํธ์จ์ด๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ์์ญ
- ์์: ๋์ ๊ตฌ๋งค ์ฌ์ดํธ
- Order Domain: ๋์ ๊ตฌ๋งค ์ฌ์ดํธ์์ ์ฃผ๋ฌธ์ ํ๋ ๋๋ฉ์ธ
- Delivery Domain: ๋ฐฐ์ก์ ๋ด๋นํ๋ ๋๋ฉ์ธ
- Member Domain: ํ์์ ๊ด๋ฆฌํ๋ ๋๋ฉ์ธ
- โก๏ธ ์ด๋ฌํ ์ฌ๋ฌ๊ฐ์ง ๋๋ฉ์ธ๋ค์ด ์๋ก ์ํธ์์ฉ ํ๋ฉฐ, ์ค๊ณํ๋ ๊ฒ์ด
๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ
- ์์: ๋์ ๊ตฌ๋งค ์ฌ์ดํธ
- ๊ฐ์ ๊ฐ์ฒด(Object or Class)๊ฐ ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ์ ์๋ค.
- ์์: ์ท ์ผํ๋ชฐ
- ์ฃผ๋ฌธ ๋๋ฉ์ธ์์์ ์ท์ ์๋๋ค์๊ฒ ํ๊ธฐ ์ํ ๊ฐ์ฒด ์ ๋ณด(name, price, ...etc)
- ์ท ๊ด๋ฆฌ ๋๋ฉ์ธ์์์ ์ท์ ์ ์ฃผ ์ ์ฅ์์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ์ฒด ์ ๋ณด(madeTime, size, madeCountry, ...etc)๋ค ์์ฃผ
- ์์: ์ท ์ผํ๋ชฐ
- ์ฆ,
๋ฌธ๋งฅ(Context)
์ ๋ฐ๋ผ๊ฐ์ฒด(Object)์ ์ญํ
์ ๋ฐ๋๋ค.
- ์ฆ,
์ด๋ ํ ์ํฉ์์ ๋ฐ๋ผ๋ณผ ๊ฒ์ธ๊ฐ?
์ ๋ํด ๊ณ ๋ฏผํด์ผ ํ๊ณ , ์ด๋ฅผ Bounded Context ๋ผ๊ณ ํ๋ค.
- ๋๋ฉ์ธ ์์ญ์ ๊ฒฝ๊ณ
- Bounded Context์ ๋ฐ๋ผ์ Model๋ค์ ์ญํ ๊ณผ ์ฑ ์์ ๋ฌ๋ผ์ง๋ค. ๊ทธ๋์ ์ด๋ฅผ ์ธ๋ถ(public)๋ก ๋ ธ์ถ์ํค์ง ์๊ณ , package-private์ผ๋ก ๋ด๋ถ์์๋ง ์ ์ ์๊ฒ ํ๋ค.
- ์ด๋ฌํ ๊ด์ ์์ ๋ ๋์๊ฐ์ ์ง์ ์๋น์ค์ ์ ์ฉ์ํจ ๊ฒ์ด
MicroService(๋ง์ดํฌ๋ก์๋น์ค)
์ด๋ค. - ๊ฐ๊ฐ์ ๋๋ฉ์ธ์ ์๋ก ์ฒ ์ ํ ๋ถ๋ฆฌ๋๊ณ , ๋์ ์์ง๋ ฅ๊ณผ ๋ฎ์ ๊ฒฐํฉ๋๋ก ๋ณ๊ฒฝ๊ณผ ํ์ฅ์ ์ฉ์ดํ ์ค๊ณ๋ฅผ ๊ฐ์ง๋ค.
cf.
๊ฒฐํฉ๋(coupling)
- ์ํํธ์จ์ด ์ฝ๋์ ํ ์์๊ฐ ๋ค๋ฅธ ๊ฒ๊ณผ ์ผ๋ง๋ ๊ฐ๋ ฅํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋์ง, ๋ํ ์ผ๋ง๋ ์์กด์ ์ธ์ง ๋ํ๋ด๋ ์ ๋
์์ง๋(cohesion)
- ํ๋ก๊ทธ๋จ์ ํ ์์๊ฐ ํด๋น ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด ์ผ๋ง๋งํผ์ ์ฐ๊ด๋ ์ฑ ์๊ณผ ์์ด๋์ด๊ฐ ๋ญ์ณ์๋์ง๋ฅผ ๋ํ๋ด๋ ์ ๋
- ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํ ์์๊ฐ ํน์ ๋ชฉ์ ์ ์ํด ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋ ๊ธฐ๋ฅ๋ค์ด ๋ชจ์ฌ์ ๊ตฌํ๋์ด ์๊ณ , ์ง๋์น๊ฒ ๋ง์ ์ผ์ ํ์ง ์์ผ๋ฉด ๊ทธ๊ฒ์ ์์ง๋๊ฐ ๋๋ค๊ณ ํํํ๋ค.
ํฌ๊ฒ 3๊ฐ์ง Layer๋ก ๊ตฌ๋ถํ๋ค.
Application Layer
a. ์ฃผ๋ก ๋๋ฉ์ธ๊ณผ Repository๋ฅผ ๋ฐํ์ผ๋ก ์ค์ ์๋น์ค(API)๋ฅผ ์ ๊ณตํ๋ ๊ณ์ธตDomain Layer
a. Entity, VO(Value Object)๋ฅผ ํ์ฉํ์ฌ ๋๋ฉ์ธ ๋ก์ง์ด ์งํ๋๋ ๊ณ์ธต
b.Entity
1) ๊ณ ์ ์๋ณ์(PK)๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด
2) ์๋ณ์๋ ๊ณ ์ ํ๋ ์ํฐํฐ์ ์์ฑ ๋ฐ ์ํ๋ ๊ณ์ ๋ณํ ์ ์๋ค.
3) ๋๋ฉ์ธ์ ๊ณ ์ ํ ๊ฐ๋ ์ ํํํ๋ค. (์: ์ฃผ๋ฌธ-Order, ํ์-Member, ์ํ-Product)
c.Value
1) ๊ณ ์ ์๋ณ์๋ฅผ ๊ฐ์ง์ง ์๋๋ค.
2) ํ๋์ ๊ฐ์ ํํํ ๋ ์ฌ์ฉํ๋ค.
3) ๋ค๋ฅธ ๋ฒจ๋ฅ ํ์ ์ ์์ฑ์ผ๋ก๋ ์ฌ์ฉ๋๋ค. (์: ์ฃผ์, ์ฐํธ๋ฒํธ)- Infrastructure Layer
a. ์ธ๋ถ์์ ํต์ (ORM, DB, NoSQL) ์ ๋ด๋นํ๋ ๊ณ์ธต
- ๊ฐ๊ฐ์ ๋๋ฉ์ธ๋ค์ ์์ ๊ฐ์ Layer๋ก ์ฒ ์ ํ ๋ถ๋ฆฌํด์ ๋ง๋๋ ๊ฒ์ด DDD์ ํต์ฌ ์ค๊ณ ๋ฐฉ์
- ์ค๊ณํ ๋๋ฉ์ธ๋ค์ ๋ชจ๋(Module) ๋ณ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ง์ดํฌ๋ก์๋น์ค(MicroService)
DDD์ ํต์ฌ์ ๊ฒฐ๊ตญ ๋๋ฉ์ธ์ ์๋น์ค ๋ณ๋ก ๋ถ๋ฆฌํ๋ผ
!
๋ชจ๋๋ฆฌ์ ์ํคํ
์ฒ
- ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋๊ณ ๋จ์ผ ์๋น์ค๋ก ์คํ๋๋ค.
- ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ํ๋ก์ธ์ค์ ๋ํ ์์๊ฐ ๊ธ์ฆํ๋ฉด ํด๋น ์ํคํ ์ฒ ์ ์ฒด๋ฅผ ํ์ฅํด์ผ ํ๋ค.
- ์ข ์ ๊ด๊ณ๋ฅผ ์ด๋ฃจ๋ฉฐ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋ ๋ง์ ํ๋ก์ธ์ค๋ก ์ธํด ๋จ์ผ ํ๋ก์ธ์ค์ ์คํจ๋ก ์ธํ ์ํฅ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ชจ๋๋ฆฌ์ ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ฉ์ฑ์ ๋ํ ์ํ์ ๊ฐ์ค์ํจ๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ฆฝ์ ์ธ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ถ๋์ด ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ก์ธ์ค๊ฐ ์๋น์ค๋ก ์คํ๋๋ค.
- ์๋น์ค๋ ๋น์ง๋์ค ๊ธฐ๋ฅ์ ์ํด ๊ตฌ์ถ๋๋ฉฐ ์๋น์ค๋ง๋ค ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ์๋น์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๊ธฐ๋ฅ์ ๋ํ ์์๋ฅผ ์ถฉ์กฑํ๋๋ก ๊ฐ๊ฐ์ ์๋น์ค๋ฅผ ์ ๋ฐ์ดํธ, ๋ฐฐํฌ ๋ฐ ํ์ฅํ ์ ์๋ค.
- ์ฐ๊ด๋ Entity ์ Value Object ์ ๋ฌถ์
- ์ฃผ๋ฌธ๊ณผ ๊ด๋ จ๋ ์ํฐํฐ๋ฅผ ํ๋์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ก ๋ฌถ์ ์ ์๋ค.
- ์ด๋ค ๊ฐ์๋ ๋น์ง๋์ค ์์กด๊ด๊ณ๋ฅผ ๋งบ๊ณ ์์ผ๋ฉฐ ๋น์ง๋์ค ์ ํฉ์ฑ์ ๋ง์ถ ํ์๊ฐ ์๋ค.
- ๋ฐ๋ผ์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ๋จ์๊ฐ
ํธ๋์ญ์ ์ ๊ธฐ๋ณธ ๋จ์
๊ฐ ๋๋ค. - ์ฝ๊ฒ ๋งํ๋ฉด, ๊ฐ๊ฐ์ ๋๋ฉ์ธ ์์ญ์ ๋ํํ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๋ก Aggregate ์ด๋ค.
- ๊ฐ๊ฐ์ ๋๋ฉ์ธ์ Repository๋ก ๋ฌถ์ด์ผ ํ๋ ๊ฐ์ฒด(Entity)๊ฐ ๋ช ํํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
- ์๋ฌธ์ฅ ๋๋ ์ ๊ทผํ๊ธฐ ์ํ ์ต์์ ๊ฐ์ฒด
- OrderItem์ ์ ๊ทผํ๊ธฐ ์ํด์ ๋ฐ๋์ Order๋ฅผ ํตํด์ ์ ๊ทผํด์ผ ํ๋ค.
- ์์ ์ฑ์ ๋ณด์ฅํ๋ฉฐ Bounded context ๋ด์์ ์ ๊ทผ๋ง ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ดํด๊ฐ ์ฝ๊ณ ์ ์ง๋ณด์์ฑ๋ ๋์์ง๋ค.
๊ธฐ์กด์๋ Hypervisor ๊ธฐ๋ฐ์ ๋ชจ๋๋ฆฌ์ ์ํคํ
์ฒ์๋ค๋ฉด,
์ง๊ธ์ Domain Service ์ค์ฌ์ผ๋ก
Container๋ฅผ Scale In / Out ํ๋ Ops ํ๊ฒฝ์ด ๋์ธ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ด๋ค.