๋๋ฉ์ธ์ ์ฌ์ ์ ์๋ฏธ๋ "์ ๋ณด์ ํ๋์ ์์ญ" ์ ๋งํ๋ฉฐ, ํํ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ๋ ์ดํ๋ฆฌ์ผ์ด์
๋ด์ ๋ก์ง๋ค์ด ๊ด์ฌํ๋ ์ ๋ณด์ ํ๋์ ์์ญ์ด๋ผ๊ณ ๋ฐ์๋ค์ฌ์ง๋๋ค.
๊ฐ๋ น, ์ด๋ค ์น ์๋น์ค๋ฅผ ๋ง๋ค ๋ ํ์์ ๊ฐ์
ํ๊ณ , ํ์์ ํํดํ๋ ์ผ๋ จ์ ์์
์ "ํ์" ๊ณผ ๊ด๋ จ๋ ์ผ๋ จ์ ์์
๋ค์ด๋ฉฐ ์ฌ๊ธฐ์ "ํ์" ์ด๋ผ๋ ๋๋ฉ์ธ์ด ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ์ฉ์ด๋ก์จ "domain layer" ์ "domain login" ์ด๋ผ๋ ์ฉ์ด๊ฐ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ผ์ข ์ "business logic" ๊ณผ ๋๋ฑํ ๊ฒ์ผ๋ก ๋ฐ์๋ค์ฌ์ ธ ์์ต๋๋ค. ์ด๋ฌํ business login ์ ๋น์ฆ๋์ค ์ฃผ์ฒด๋ค(๊ฐ๋ น ํ์, ๊ฒฐ์ ๋ฑ) ์ด ์ด๋ค ๋ชจ๋ธ๋ง ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์๋ก๊ฐ์ ์ฝ์ํ ๋์ ์์ค์ ๊ท์น๋ค์ ์๋ฏธํฉ๋๋ค.
๋๋ฉ์ธ ์ฃผ๋ ๋์์ธ์ด๋ ๊ฐ๋ฐ์ ํจ์ ์์ด ์์์ ์ค๋ช
ํ ๋๋ฉ์ธ์ด ์ค์ฌ์ด ๋๋ ๊ฐ๋ฐ ๋ฐฉ์์ ๋งํ๋ฉฐ, ๊ทธ ๋ชฉ์ ์ ์ํํธ์จ์ด์ ์ฐ๊ด๋ ๋ถ๋ถ๋ค์ ์ฐ๊ฒฐํ์ฌ ๊ณ์ ํด์ ์งํํ๋ ์๋ก์ด ๋ชจ๋ธ์ ๋ง๋ค์ด ๋๊ฐ ๋ณต์กํ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ง๋๋ ๊ฒ์ ์ฝ๊ฒ ํด ์ฃผ๋ ๊ฒ์ ์์ต๋๋ค.
DDD์ ํต์ฌ์ ์ธ ๋ชฉํ๋ Loose Coupling, High Cohesion ์ผ๋ก ๊ฐ ๋๋ฉ์ธ์ด ์ฐ๊ฒฐ์ฑ์ด ์ ๊ณ ๋์ ์ ๋๋ก ์ฐ๊ด๋์ด ๋ณด๋ค ๊ฐ๋ฒผ์ด ์ค๊ณ๋ฅผ ์ํด ํ์ํ์์ต๋๋ค.
๋ค์์ DDD์ ์ธ๊ฐ์ง ์ฃผ์ ์๋ฆฌ์ ๋๋ค.
์ํํธ์จ์ด๋ฅผ ๋์์ธ ํ ๋ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์์ธ์ ์งํํ๋ ๊ฒ์ Object Oriented Design ์ด๋ผ๊ณ ํ๋ค. ์ด๋ฌํ ๊ด์ ์์ ๋ณผ ๋ Strategic Design์ OOD๊ฐ ์ ์ด๋ฃจ์ด์ง ๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.
Strategic Design์ด๋ Context ์ ๋ํด ์๊ฐํ๊ณ ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋์์ธ์ ํ๋ ๊ฒ์ ๋งํ๋ค.
์ฌ๊ธฐ์ Context๋ ๋ฌด์์ผ๊น? Context ๋ ํน์ ๊ฐ์ฒด ํน์ ์ํฉ์ด ๋ฒ์ด์ง๋ ์ฃผ๋ณ ํ๊ฒฝ์ ๋งํ๋ค. ๊ฐ์ฅ ์ฌ์ด ์๋ก ๊ฐ๊ฒ ์์ ์ ์์ ๋ด๊ธด ํผ์์ ํน์ ๊ธธ์ ๋ฒ๋ ค์ง ํผ์๋ฅผ ์๊ฐํด ๋ณด์. ๊ฐ์ ํผ์์ด์ง๋ง ํผ์๊ฐ ๋งค์ฅ ์์ ์ ์์ ์๋์ง ํน์ ๊ธธ์ ์๋์ง์ ๋ฐ๋ผ ์ ๋ฃ, ๋ฌด๋ฃ์ ์ฐจ์ด๊ฐ ์๊ธฐ๊ฒ ๋๊ณ ์ฌ์ค์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์๋ค. ์ด์ฒ๋ผ ๊ฐ์ ์ฌ๋ฌผ์ด๋ ํ๋ ์์์ด ๋ฒ์ด์ง๋ ์ํฉ์ ์ง์คํ์ฌ ๋์์ธ์ ํ๋ ๊ฒ์ด Strategic Design ์ ํต์ฌ์ด๋ผ๊ณ ํ ์ ์๋ค.
Strategic Design์ ์ดํดํ๊ธฐ ์ํด ๊ฐ๋จํ ์๋ก ์ฃผํ์ ์ง๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์.
์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ง์ ์ง๊ธฐ ์ํด์ ์ฐ๋ฆฌ๊ฐ ํ๋ ํ๋ ์ ์ฐจ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๋ ๊ฒ DDD๋ฅผ ํตํ ์ค๊ณ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ์ฉ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋จผ์ ์ง ์ ์ฒด์ ๋ํ ์ค๊ณ์ ์ ์ฒด๋ฅผ ์ฐ๋ฆฌ๋ domain ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ปค๋ค๋ ์ง์ ๊ฐ๊ฐ์ ๋ถ๋ถ ์งํฉ์ธ ํ๊ฐ, ๋์ฅ, ์์์ฅ ๋ฑ ํฐ ํํธ๋ค์ subdomain ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋ ๊ฐ๊ฐ์ subdomain์ ๋ํด ๊ฐ subdomain์ ๋ฌธ๋งฅ์ ์ํฉ์ bounded context ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ค์ subdomain์ ๊ตฌ์ฒด์ ์ธ ํ์์ ๋ํ๋ด๋ ๊ฒ์ domain model ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์ฌ๊ธฐ์ bounded context ๊ฐ ๊ฐ์ง๋ ์๋ฏธ๋ ๋ฐ๋ก ํน์ ๋ชจ๋ธ์ด ์ด๋ค bounded context ์ ์ํ๋ ๊ฐ์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ฐ๋ น, ์ฃผํ ๊ฑด์ถ์์ ์ ๋ฌธ์์ caretaker๋ผ๋ ๋ชจ๋ธ์ด ์๋ค๋ฉด ์ด๋ ๋ฐ๋ก ๊ฒฝ๋น์์ ๋งํ๋ ๊ฒ์ผ ๊ฒ๋๋ค. ํ์ง๋ง caretaker๋ผ๋ ๋จ์ด๊ฐ ๋ฉ์ธ ์ฃผ๊ฑฐ ๊ฑด๋ฌผ ์์์ ๊ฐ์ง๋ ์๋ฏธ๋ ์ด์ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์ด ๋ด์ฉ์ ๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Context
์๋ฏธ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๋จ์ด ๋ ๋ฌธ์ฅ์ด ๋ํ๋๋ ์ค์ ์ผ๋ก, ๋ชจ๋ธ์ ๊ดํ ๋ฌธ์ฅ์ context ์์์๋ง ์ดํด๋ ์ ์๋ค.
์ฃผํ์ ๊ตฌ์ฑํ๋ ๊ฐ ๋ถ๋ถ ๊ตฌ๊ฐ๋ค์ ๋ํ ํ๊ฒฝ์ ๋งํ๋ค.
Model
๋๋ฉ์ธ์ ํน์ ์์์ ๋ฌ์ฌํ๋ ์ถ์ํ ์์คํ
์ผ๋ก ๋๋ฉ์ธ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
Ubiquitous Language
domain model ์ ๋๋ฌ์ผ ์ธ์ด๊ตฌ์กฐ๋ฅผ ๋งํ๋ฉฐ, ์ด ์ธ์ด๋ ํ ์ ์ฒด๊ฐ ๊ฐ๊ฐ์ ์
๋ฌด ํํธ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ด์ผ ํ๋ค.
์ฃผํ์ ๊ฒฝ์ฐ ๊ฐ bounded context ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฑฐ์ค, ์์ค, ์๋ฐฉ ๋ฑ๊ณผ ๊ฐ์ ์ดํ๋ ์ง ์ ์์, ๊ฑด์ถ์
์ ๋ฑ ๋ชจ๋ ์ฌ๋๋ค์ด ๊ณตํต์ผ๋ก ์ดํดํ๊ณ ์ฌ์ฉํ๋ ์ดํ์ธ๋ฐ ์ด๊ฒ์ ubiquitous language ๋ผ๊ณ ํฉ๋๋ค.
์ค์ ๊ฐ๋ฐ์ ์ธก๋ฉด์์ ๋ชจ๋ ๊ธฐํ์, ๋์์ด๋, ๊ฐ๋ฐ์๊ฐ ๊ณตํต๋ ์ดํ๋ฅผ ์ฌ์ฉํด์ผ ์๋ก๊ฐ์ ์ด๊ฒฌ์ด ์์ ๊ฒ์ด๋ฉฐ ์ด๋ฌํ ๊ณตํต๋ ์ดํ๋ฅผ ubiquitous language๋ผ๊ณ ํฉ๋๋ค.
Bounded Context
์์์ ์ค๋ช
ํ Context์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ค๋ช
์ผ๋ก, ํน์ ๋ชจ๋ธ์ด ์ ์๋๊ณ ์ ์ฉ๋ ์ ์๋ ์์ญ์ ์ด์ผ๊ธฐ ํฉ๋๋ค.
์ฃผํ์ ์ง๋ ๊ฒฝ์ฐ์ ๋น๋์ด ์๊ฐํด ๋ณผ ๋, Bounded Context๋ ์ฃผํ ์ ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ํ๊ฐ, ๋์ฅ, ์์์ฅ, ๋ฉ์ธ ์ฃผํ ๋ฑ์ ํฐ ์์๋ค ๊ฐ๊ฐ์ ๋๋ฌ์ผ ์ํฉ์ ์๋ฏธํฉ๋๋ค.
ํน์ ๋ชจ๋ธ์ ์ด๋ค bounded context์ ๋์ด๋๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ดํด๋ ์ ์์ต๋๋ค.
์ค์ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํจ์์์ ์๋ฅผ ๋ค๋ฉด ๊ฐ๋ น sales๋ฅผ ๋ด๋นํํ๋ subdomain์ด ์์ ์ ์๊ณ , ์ด๋ฅผ ์ง์ํ๋ support์ accounting ๋ผ๋ subdomain ์ด ์กด์ฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ๊ฐ์ subdomain์ด ๋์ธ ํ๊ฒฝ์ธ bounded context ๋ด์์ ํน์ ๋ชจ๋ธ customer ๊ฐ ๋ณด์ฌ์ง๋ ์๊ฐ์ ๋งค์ฐ ์์ดํ ์ ์์ต๋๋ค. sales ํ์์ ๊ณ ๊ฐ์ ๋ณด๋ ์๊ฐ์ ์ฃผ๋ก ์ฌํ์ ๊ด์ฌ์ฌ, ์ข์ํ๋ ๊ฒ, ์๊ตฌ ๋ฑ์ ๊ฒ์ผ ๊ฒ๋๋ค. ํ์ง๋ง accounting์ ์ธก๋ฉด์์๋ ์ฌ์ฉ์๋ ๊ทธ์ ํ๋์ ๊ณ์ ์ผ๋ก์จ ๊ทธ ์ฌ๋์ ๊ฒฐ์ ์ ๋ณด ๋ง์ด ์ค์ํ ์ ๋ณด์ผ ์ ์์ต๋๋ค. ์ฆ ๊ฐ๊ธฐ ๋ค๋ฅธ bounded context์์ ubiquitous language๋ ๋น๋ก ํํ์ ๊ฐ์ง๋ง ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
Context Map
๊ฐ bounded context๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋งํ๋ค.
์ฆ ์ฃผํ ๊ฑด์ถ์์ ํ๊ฐ, ๋ท๊ฐ, ์์์ฅ ๋ฑ ํฐ ์์๋ค์ด ์ด๋ค์์ผ๋ก ์๋ก ์ฐ๊ด์ด ๋์ด ์๋์ง๋ฅผ ๋ํ๋ธ๋ค.
Domain Model
Domain Model ์ด๋ ์ค์ ์ธ๊ณ๋ฅผ ๋ฐ์ํ๋ ๊ตฌ์ฒด์ ์ธ ์ค๊ณ๋ก, ์ฃผํ ๊ฑด์ถ์์ ์ฃผํ์ ๊ตฌ์ฑํ๋ ๋ฉ์ธ ์ฃผํ์ ๊ตฌ์ฒด์ ์ธ ์ค๊ณ๋๋ฅผ ๋งํ๋ค.
Tactical Design Tool ๋ค์ ์ธ๋ถ์ ์ธ ์ฌํญ์ ๊ตฌํํ๋ ๊ฒ์ ์ํด ํ์ํ๋ฉฐ, ์ฃผ๋ก Bounded Context ๋ด์ ๊ตฌ์ฑ ์์๋ค์ ๊ด๋ฆฌํฉ๋๋ค.
์ด๊ฒ์ ๊ฐ๋ฐ์์ ์ค์ ์ ์ธ ํ์ค์ ์ ๊ณตํ๋๋ฐ services, entities, repositories, factories ์ ๊ฐ์ ์ํํธ์จ์ด ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ค์ ์ต์ํ ๊ฐ๋ฐ์๋ค์ด ๋ง์ ๊ฒ์ธ๋ฐ, ์ด ๋ชจ๋ ๊ฒ์ ์ ๋ถ DDD์์ ๋์จ ๊ฐ๋
์
๋๋ค. ์ด๋ฌํ Tactical Design์ Strategic Design๊ณผ ๋ฌ๋ฆฌ ๊ฐ๋ฐ์ ์งํํ๋ ๊ณผ์ ์์ ๊ณ์ํด์ ๋ฐ๋๊ณ ๊ฐ์ ๋ฉ๋๋ค.
Tactical Design์ ์ดํดํ๊ธฐ ์ํ Model Driven Design์ ์์ ๊ฐ๋ค.
์ค์ ๊ตฌํ์ ๋ชจ๋ธ ์์ค์์ ์ด๋ฃจ์ด ์ง๊ณ ์ฝ๊ฒ ๋น์ ํ์๋ฉด ๋น์ ์ ์ํํธ์จ์ด ์ ์ฒด ์ฆ, domain์ ํ๋์ ์ธ๊ณ๋ก ํํํ๋ค๋ฉด ๊ฐ ๋๋ผ๋ subdomain์ ํด๋น๋๊ณ ๊ฐ subdomain์ ๊ฐ ๋๋ผ์ ์ธ์ด์ธ ubiquitous language๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ๊ฐ subdomain์ ํ๋์ Service๋ก ๊ตฌํ๋๊ฒ ๋๋ค.
layered Architecture๋ ์ฝ๊ฒ ๋งํ๋ฉด ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ์
๋ฌด์์๋ก ์ชผ๊ฒ์ด ์ธต์ ๋๋์ด ์ํํ๋ ๊ฒ์ด๋ค.
๊ฐ๋ น ๋งฅ๋๋ ๋์ ์๋ฅผ ๋ค์ด๋ณด์. ๋งฅ๋๋ ๋์์๋ ๊ฐ ์ข
์
์๋ค์ด ๋งก์ ์
๋ฌด๋ฅผ ์ถฉ์คํ๊ฒ ์ํํ์ฌ ์์ฃผ ํจ๊ณผ์ ์ผ๋ก ์
๋ฌด๋ฅผ ์ฒ๋ฆฌํ๋ค. ๋ง์ฝ ๋งฅ๋๋ ๋์ ์ข
์
์๋ค์ด ์๋ฆฌ, ๊ณ์ฐ, ์๋น ๋ฑ ๋ง์ ์
๋ฌด๋ฅผ ์
๋ฌด ๋ถ๋ด ์์ด ํ๊ฒ ๋๋ค๋ฉด ๋ถ๋ช
ํ ํฐ ํผ๋์ด ์ด๋๋๊ณ ์๋๋ค์ ์ค๋์๊ฐ ๋์ ๊ธฐ๋ค๋ ค์ผ ํ๊ณ ํํธ์๋ ์์์ ๋จน๊ฒ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋งฅ๋๋ ๋๋ ์๋์ ์๋ํ๋ ๊ณ์ฐ์, ์ฃผ๋ฌธ์ ์ ๋ฌํ๊ณ ์ปจํธ๋กค ํ๋ ์ค๊ฐ ๋งค๊ฐ์ธ, ์ ์ฒด ํ๋ก์ธ์ค์ ํ์ํ ์ธํ๋ผ๋ฅผ ์ ๊ณตํ๋ ์๋ฆฌ์ฌ, ์ฌ์ฅ, ๋งค๋์ , ํ์ํ ์ฌ๋ฃ๋ค์ ๋ณด๊ดํ๋ ์ฐฝ๊ณ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ผ๋ก ์ผ์ ์ฒ๋ฆฌํ๋ค.
์ํํธ์จ์ด์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ ๊ฐ์ ์๋ํ๋ request handler, ์ด๋ฅผ ์ค์ฌํ๋ controller, ๊ฐ์ข ์ค์ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ business, ๋ค์ํ ์๋ฃ๊ตฌ์กฐ ๋ฑ์ผ๋ก ๊ตฌ์ฑ๋์ด ํด๋ผ์ด์ธํธ์ ๋ณด๋ค ๋นจ๋ฆฌ, ์กฐ์ง์ ์ผ๋ก, ์ ์๋ํ ์ ์๊ฒ ๋์๊ณ , ์ด์ ๋ฐ๋ผ ๋ณด๋ค ์ ์ฐํ๊ณ ์ง์๊ฐ๋ฅํ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ๋์์ผ๋ฉฐ, ๊ฐ ํํธ๋ ์์ ์ ์ญํ ์ ์ถฉ์คํ ์ํํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์ฌ๋ฌ๋ฒ ์ฌ์ฌ์ฉ ๋ ์ ์๊ฒ ๋๋ค.
์ํํธ์จ์ด์ ๋ชจ๋ธ์ ๊ตฌ์ฑํ๋ ์์น์ ๋ํ ๊ฐ์ฒด์ด๋ฉฐ ํ๋ฅญํ ๋์์ธ์ ์ํ ๊ฐ์ฅ ์ค์ํ ์์ ์ค์ ํ๋์ด๋ค.
๊ฐ๋ น ์ํํธ์จ์ด ๋ด์ ํํ๋ฅผ ์ทจ๊ธํ๋ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด, ์ด๋ ํํ์ ๊ดํ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ๋๊ตฐ๊ฐ์ ๋์ ์์ด ์ค์ค๋ก ์ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๋ค.
๋จ์ ํ์ฐ, ํํ๋ฒ ๋ณ๊ฒฝ ๋ฑ ๋ค์ํ ๋๋ฉ์ธ ๋ก์ง์ ๊ฐ์ ธ์ผ ํ๋ฉฐ, ์ค์ค๋ก ์ณ๋ฐ๋ฅธ ๊ฐ์ธ์ง validate ํ ์ ์์ด์ผ ํ ๋ฟ ์๋๋ผ ๊ฐ์ด ์ 3์์ ์ํด ๋ณํ์ง ์๊ณ ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํ๋ค.
๊ฐ๋ น string ๊ฐ์ฒด๋ฅผ ์๊ฐํด ๋ณด์. ์ด ๊ฐ์ฒด๋ ๋ฌธ์ ์ด๋ ์ด๋ฅผ ๋ค๋ฃจ๋ value object๋ก์จ substring ๋ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ผ์ผํ ์ ์ํ ํ์๊ฐ ์์ด์ ธ ubiquitous language ๋ก ์ํํธ์จ์ด์ ํํ์ ๊ฐ๋จํ๊ฒ ํ๊ณ ๋ณด๊ฐํด ์ค๋ค.
๊ธฐ์กด์ attributes ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์๋์๋ ์ ํต์ ์ธ ๊ฐ์ฒด์ ๋ฌ๋ฆฌ, ์ฐ์์ฑ์ ์ผ๊ด๋ ์ค๋ ๋์ ์ํด ์๋ณ๋๋ ๊ฐ์ฒด์ด๋ค.
์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ์๋ค์ด ์ด ๊ฐ๋
์ ๋ํด ์๊ณ ์๋ค. Entity๋ Value Object๋ก ๊ตฌ์ฑ๋๋ฉฐ ๋ํ์ ์ธ ์๋ก db์ ์๋ row๋ค์ ์๋ฅผ ๋ค ์ ์๋ค.
Entity๋ identified id ๋ฅผ ๊ฐ์ง๊ณ business logic์ ๊ตฌํํ๋ค.
aggregates๋ entities์ ์งํฉ์ด๋ค. ๊ฐ๋ น cutomer, customerInfo, address ๋ผ๋ ์ธ๊ฐ์ง ์ข ๋ฅ์ entities๋ฅผ ์๊ฐํด ๋ณด์. ์ฌ์ค ์ด ๋ชจ๋ ์ ๋ณด๋ customer๋ผ๋ ์ฃผ์ ๋ก ๋ญ์น ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ํต์ฌ์ด ๋๋ entitiy์ธ customer๋ ์ด ์ธ entities๊ฐ ์ด๋ฃจ๋ aggregates์ root entity๊ฐ ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด, ๋ค๋ฅธ ์ธ๋ถ ๊ฐ์ฒด๋ aggregate ๋ด์ ๊ฐ์ฒด๋ก ์ง์ ์ ๊ทผํ ์ ์๊ณ , ํ๋์ aggregate root item ์ฆ customer ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ฅผ ํตํด ํด๋น aggregate ๋ด์ ๋ช ๋ น์ ์ ๋ฌํด์ผ ํ๋ค. ์ด๋ ์ค์ ํ๋ก๊ทธ๋๋ฐ์ ์์ฃผ ์ฐ์ด๋ ๋์์ธ ํจํด ์ค์ ํ๋์ด๋ค.
๋์ฑ ๊ฐํธํ ์๋ก๋ ํฌ์คํธ์ ๋๊ธ์ ๊ด๊ณ, ์ง๋ฌธ๊ณผ ๋ต๋ณ์ ๊ด๊ณ ๋ฑ์ด ์๋ค.
์ฌ๊ธฐ์ Domain Event ๋ผ๋ ๊ฐ๋
์ ๋ํด ์ดํ๋ณด์.
domain event๋ ๋ชจ๋ธ์ ํน์ ํ๋๊ณผ ๊ด๋ จ๋ ์ด๋ฒคํธ์ธ๋ฐ, Aggregate ์ฌ์ด์ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ฐ์ ์ฌ์ฉ๋ ์ ์๋ค.
๊ฐ๋ น ์ฌ์ฉ์์ ์ฃผ์๊ฐ ๋ฐ๋๋ฉด ์ฃผ๋ฌธ ๋ด์ฉ๋ ๋ฐ๋์ด์ผ ํ๋๋ฐ, ์์๋ฅผ ์ดํด๋ณด๋ฉด ์ฌ์ฉ์์ ์ฃผ์๊ฐ ๋ฐ๋๋ฉด ๊ฐ์ aggregate๋ด์ ์๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ฐ๋๊ฒ ๋๊ณ ์ด๋ฌํ aggregate์ ๋ณํ๋ ์ฃผ๋ฌธ๊ณผ ๊ด๋ จ๋ aggregate์ ๋ณํ๋ฅผ ์ด๊ตฌํ๊ธฐ ์ํด domain event๋ฅผ ๋ฐ์์์ผ ์ํธ๊ฐ์ ์ ๋ณด์ ์ผ์น๋ฅผ ์ด๋ฃฌ๋ค.
Factories๋ ๋ณต์กํ entity ํน์ aggregate๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ด๋นํ๋ค.
๊ฐ๋ น ์์ง๊ณผ ๋ถ์ํ์ ๋ฃ์ผ๋ฉด ์๋์ฐจ๊ฐ ๋์ค๋ ๊ณต์ฅ๊ณผ ๊ฐ์ด ํน์ ์ ๋ณด๋ฅผ factory์ ๋ณด๋ด๋ฉด ๊ฒฐ๊ณผ๋ก aggregate ํน์ entity๋ฅผ ๋ง๋ค์ด์ฃผ๊ฒ ๋๊ณ , ๊ทธ ์์์ ๋ฒ์ด์ง๋ ์ผ์ ๋ํด์๋ ๊ฐ๋ฐ์๋ค์ด ๋ ์ด์ ์ ๊ฒฝ์ ์ฐ์ง ์์๋ ๋๊ณ , ํ๋์ ๋ชจ๋๋ก์จ ์ฌ์ฉํ ์ ์๋ค.
์ผ๋ฐ์ ์ธ ์ ์ฅ์์ ๋ฌ๋ฆฌ ํน์ aggregate์ ๋ณด๋ค ์ ์ํ๊ฒ ์ ๊ทผํ๊ณ aggregate ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด ์ค๋ค.
๊ฐ๋ น ์์ ์์ฒ๋ผ customer ๊ฐ root entity๋ก ์๋ aggregate์ ๊ฒฝ์ฐ 1๊ฐ์ repo๋ฅผ ๋ง๋ค๊ฒ ๋๊ณ , ์ฌ์ฉ์๋ ๋ ์ด์ ๊ธฐ์กด์ db์์ ๊ณ ๊ฐ ์ด๋ฆ, ๋์ด, ์๋
๋ฑ์ ์กฐํฉํด์ ์ฌ์ฉํ์ง ์๊ณ repo์ aggregate๋ฅผ ํต์ผ๋ก ์ ์ฅํด์ ๋ณด๋ค ์ฝ๊ฒ ์ ๋ณด์ ์ ๊ทผํ๊ณ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
Domain-driven design also heavily emphasizes the ever-more-popular practice of continuous integration, which asks the entire development team to use one shared code repository and push commits to it daily (if not multiple times a day). An automatic process executes at the end of the work day, which checks the integrity of the entire code base, running automated unit tests, regression tests, and the like, to quickly detect any potential problems that may have been introduced in the latest commits.
๊ณผ๊ฑฐ์ Use Case Diagram, Sequence Diagram ๋ฑ ๋ง์ ๊ฒ์ ์ป๋ค.
๋๋ก๋ ER Diagram๋ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ์์ฆ์๋ ์ด๋ฐ ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ง ์๊ณ , Event Storming์ ํ๋ค.
์ด๊ฒ์ strategic design ์ ์ํด ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ง๋ค๊ธฐ ์ํ ์ฐ์ต์ด๋ค.
๊ฐ๋ฐ ์ ๋ฌธ๊ฐ์ domain ์ ๋ฌธ๊ฐ๊ฐ ๋ง๋์ ๋ธ๋ ์ธ ์คํ ๋ฐ์ ํตํด ๊ฐ ๋๋ฉ์ธ์์ ์ด๋ค ๋ด์ฉ๋ค์ด ํ์ํ ์ง์ ๋ํ ์ง๊ด์ ๊ธฐ๋ฅธ๋ค.
์ฐธ๊ณ ์๋ฃ - Alpha Code ๋์์ ๊ฐ์
**** all images are from Alpha Code Lecture Above ****