๐ DDD(Domain Driven Design)
โ ๋๋ฉ์ธ์ ์ค์ฌ์ผ๋ก ๋๋์ด ์ค๊ณํ๋ ๋์์ธ ๋ฐฉ๋ฒ๋ก ์ด๋ค.
โผ ๋๋ฉ์ธ์ ๋ชจ๋ธ๊ณผ ๋ก์ง์ ์ง์คํ๋ค.
โผ ๋จ์ผํ๋, ๋ณดํธํ๋(ํต์ผํ๋) ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค.
โผ ๋ถ์ ๋ชจ๋ธ๊ณผ ์ค๊ณ, ๊ฐ๋ฐ ๋ชจ๋ธ์ ๊ฐ๋ ์ด ์ผ์นํ๋ค.
๐ฅ DDD์ ํ์ ๋ฐฐ๊ฒฝ
โผ DDD๊ฐ ๋์ค๊ฒ ๋ ์ด์ ๋ ์ค๊ณ์์ ๊ฐ๋ฐ์ ๋ ์ฌ์ด์ ์ธ์ด ์ฅ๋ฒฝ์ ํด๊ฒฐํ๊ธฐ ์ํจ์ผ๋ก, ์ค๊ณ์์ ๊ฐ๋ฐ์ ๋ชจ๋ ๋๋ฉ์ธ ๊ด์ ์์ ๋ฌธ์ ๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ํ๊ธฐ ์ํด์์ด๋ค.
โผ ๋ณต์กํ ๋๋ฉ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ๊ณ ์๋์๋ค.
๐ฅ Domain์ด๋?
์ฌ์ ์ ์ผ๋ก '์์ญ', '์งํฉ'์ ์๋ฏธํ๊ณ , ์ค์ง์ ์ผ๋ก๋ ์ฐ๋ฆฌ๊ฐ ์ํํธ์จ์ด๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ ๋ฌธ์ ์ ์์ญ์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ์จ๋ผ์ธ ์์ ์ฃผ๋ฌธ์ด๋ผ๋ ๋ฌธ์ ๋ฅผ ์ํํธ์จ์ด๋ก ํด๊ฒฐํ๊ณ ์ ํ๋ค๋ฉด, '์จ๋ผ์ธ ์์ ์ฃผ๋ฌธ'์ ๋๋ฉ์ธ์ ํด๋น๋๋ค. ๋ํ, ํ ๋๋ฉ์ธ์ ๋ค์ ํ์ ๋๋ฉ์ธ์ผ๋ก ๋๋ ์ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ์์๋ ๊ฒฐ์ , ๋ฐฐ์ก, ์ ์ฐ, ์นดํ๋ก๊ทธ ๋ฑ์ ํ์ ๋๋ฉ์ธ์ ๊ฐ์ง ์ ์๋ค.
๐ฅ Domain Model
ํน์ ๋๋ฉ์ธ์ ๊ฐ๋ ์ ์ผ๋ก ํํํ ๊ฒ์ผ๋ก, ๊ธฐํ์ด๋ ๋์์ธ, ๊ฐ๋ฐํ ๋ ์์ฌ์ํต์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
๐ Domain Layer
์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๊ณํ ๋, ๋ค์๊ณผ ๊ฐ์ด 4๊ฐ์ง ์์ญ์ผ๋ก ๋ถ๋ฆฌ๋ ์ ์๋ค.
โผ Presentation Layer: ํํ์ ์์ญ์ผ๋ก, UI๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ Application ์์ญ์ผ๋ก ์ ๋ฌํ๊ณ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค. (Controller)
โผ Application Layer: ์์ฉ์ ์์ญ์ผ๋ก, ์์คํ ์ด ์ฌ์ฉ์์๊ฒ ์ ๊ณตํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. (Service)
โผ Domain Layer: ๋๋ฉ์ธ์ ์์ญ์ผ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ตฌํํ๋ค. (์ฌ์ฉ์, ๊ฒ์ํ...)
โผ Infrastructure Layer: ๊ตฌํ ๊ธฐ์ ์ ์์ญ์ผ๋ก, ๊ตฌํ ๊ธฐ์ ์ ๋ํ ๊ฒ์ ๋ค๋ฃฌ๋ค. (๋ฐ์ดํฐ ๋ฒ ์ด์ค, ์ธ๋ถ API...)
โ DDD์ ๊ด๋ จ๋ ์์ญ์ Domain Layer์ด๋ฉฐ, ๋๋ฉ์ธ ์์ญ์ ๋๋ฉ์ธ์ ๊ตฌํํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๋๋ฉ์ธ์ธ ๊ฒฝ์ฐ ์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ, ์ฌ์ฉ์ ์ ๋ณด ๋ณ๊ฒฝ ๋ฑ์ ๊ธฐ๋ฅ๋ค์ Domain ๋ด์์ ๊ตฌํํ๋ค.
๐ DDD์ ์ค์ ๊ฐ๋
โ Bounded Context
์๋น์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ์ ๋, ๋ฌธ์ ๊ฐ ์์ด ๋์๊ฐ๋ ์์ญ, ์ฆ ๋๋ฉ์ธ ๋ชจ๋ธ์ด ์๋ํ๋ ์ปจํ ์คํธ๋ฅผ ๋ช ์ํ๋ ๊ฒ
ํ๋์ ํ๋งค ์ฌ์ดํธ๋ฅผ ๋ง๋ค ๋, ๊ธฐ๋ฅ ์์ญ๋ค์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ถํ ์ ์๋ค.
User, ์ปจํ ์ธ ์ ์, ์์ฝ ๋ฐ ์๋ฆผ, ์ธ์ฆ, ๋ฉํ ์ ๋ณด ๊ด๋ฆฌ, ์ ์ฐ, 3rd Party, ํ๋งค, ํต๊ณ...
๋ค์ํ ์์ญ๋ค์ ๊ฐ์ง๊ณ ๋ถ๋ฅํ์ฌ ์๋ก์ ์์กด์ฑ์ ์ค์ด๊ธฐ ์ํด ๊ฒฝ๊ณ๋ฅผ ๊ตฌ์ฑํ๊ณ , ๊ฒฝ๊ณ๋ฅผ ๋ฐํ์ผ๋ก ์๋น์ค๋ก ๋๋ ์ ์๋ค. ์ ์ํฉ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฆฌํ ์ ์๋ค.
User, ์ธ์ฆ, 3rd Party, ์ปจํ ์ธ ์ ์ + ๋ฉํ ์ ๋ณด ๊ด๋ฆฌ + ํ๋งค, ์์ฝ ๋ฐ ์๋ฆผ, ์ ์ฐ + ํต๊ณ
โ Context Map
Bounded Context ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ณด์ฌ์ค๋ค.
โ Aggregate
์ฐ๊ด๋ Entity์ Value Object์ ๋ฌถ์์ผ๋ก, ๋ช ๋ น์ ์ํํ๊ธฐ ์ํด ํจ๊ป ์กฐํํ๊ณ ์ ๋ฐ์ดํธ ํด์ผ ํ๋ ๋จ์์ด๋ค.
์ฐ๊ด๋ ๊ฐ์ฒด๋ค์ ๋ฌถ์ด์ ํ๋์ ๋จ์ผํ ๊ฐ๋ ์ผ๋ก ๋ค๋ฃจ๋ ํจํด์ด๋ค.
โ ๊ฐ์ Aggregate์ ์ํ๋ ์ํฉ
์ฃผ๋ฌธ๊ณผ ์ฃผ๋ฌธ ์์ดํ ์ ๋ชจ๋ ์ฃผ๋ฌธ ์์ ์ ์์ฑ๋๊ณ ์ ๋ฐ์ดํธ ๋๋ฏ๋ก ๊ฐ์ Aggregate์ ์ํ๋ค.
โ ๋ค๋ฅธ Aggregate์ ์ํ๋ ์ํฉ
์ํ ์ ๋ณด์ ์ฌ์ฉ์ ๋ฆฌ๋ทฐ๋ ๋ค๋ฅธ Aggregate์ ์ํ๋ค. ์ํ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ๋ ์ฃผ์ฒด์ ์ฌ์ฉ์ ๋ฆฌ๋ทฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฃผ์ฒด๊ฐ ๋ค๋ฅด๊ณ ์๋ก์ ๋ณ๊ฒฝ์ด ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
โ Root Aggregate
์ ๊ทผํ๊ธฐ ์ํ ์ต์์ ๊ฐ์ฒด๋ก, Root Aggregate๊ฐ Aggregate์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๋ค๋ฅธ ์ํฐํฐ๋ค์ ๋ฃจํธ ์ํฐํฐ์ ๊ฐํ ๊ด๊ณ๋ฅผ ๊ฐ์ง๋ฉฐ ๋ฃจํธ ์ํฐํฐ ์์ด๋ ์กด์ฌํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ OrderItem์ ์ ๊ทผํ๋ ค๋ฉด ๋ฐ๋์ Order๋ฅผ ํตํด์ ์ ๊ทผํด์ผ ํ๋ค.
Root Aggregate์ ์ญํ ์ Aggregate์ ์ผ๊ด์ฑ์ ๊นจ์ง์ง ์๊ฒ ํ๋ ๊ฒ์ผ๋ก, Aggregate ์ธ๋ถ์์ Aggregate์ ์ํ ๋ด๋ถ ๊ฐ์ฒด์ ์ง์ ๋ณ๊ฒฝํ๋ฉด ์๋๊ณ , Root Aggregate๋ฅผ ํตํด์ ์ ๊ทผํด์ผ ํ๋ค.
โ Aggregate ์ด์
โผ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ณต์ก์ฑ์ ๊ฐ์์ํจ๋ค. -> ์ฐ๊ด๋ ๊ฐ์ฒด๋ค์ ๋ฌถ์ด์ ํ๋์ ๊ฐ๋ ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ
โผ ๋๋ฉ์ธ ๊ฐ์ฒด์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค. -> ๋ฃจํธ ์ํฐํฐ๋ฅผ ํตํด ํ์ ์ํฐํฐ๋ค์ด ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ
โผ ๋๋ฉ์ธ ๊ฐ์ฒด์ ๊ฒฝ๊ณ๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ ์ ์๋ค. -> Aggregate ์ธ๋ถ์์ ๋ด๋ถ ๊ฐ์ฒด๋ฅผ ์ง์ ์ ๊ทผํ์ง ์๋๋ก ์ ํํ ์ ์๋ค.
๐ ์ ๋ฆฌ
โ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ํจํค์ง ๊ตฌ์กฐ ์ค๊ณํ๊ธฐ
์์ ํ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ดํ๊ณ , ํจ๊ป ์กฐํ๋๊ณ ์ ๋ฐ์ดํธ ๋์ด์ผ ํ๋ ๊ด๊ณ, ๋ฃจํธ ์ํฐํฐ ์์ด๋ ์กด์ฌํ ์ ์๋ ๊ด๊ณ๋ค์ ํ๋์ Domain ํจํค์ง ๋ด์์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋งบ์ด ๊ฐ๋ฐํ๊ณ , Root Aggregate์ Repository๋ฅผ ์ด์ฉํด Root Aggregate๋ฅผ ์กฐํํ ํ, ์ดํ ํ์ ๋๋ฉ์ธ์ ๋ํด CRUD ์์ ์ ์งํํ๋ค.(CASCADE ์ต์ ์ฌ์ฉ)
์ด๋ฐ ๊ด๊ณ๊ฐ ์๋ ๋ถ๋ถ์ ๋ค๋ฅธ domain๋ด ํจํค์ง๋ก ๋ง๋ ํ, ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ๊ธฐ๋ณธ ํค๋ฅผ ๊ฐ๋ ํํ๋ก ์ค๊ณํ๋ค.
'Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
spring์์ flyway ์ฌ์ฉํ๊ธฐ (0) | 2023.05.26 |
---|---|
[Spring] checkstyle ์ ์ฉํ๊ธฐ (0) | 2023.05.03 |
[Spring] Rest-Docs ์ฐ๊ฒฐ (0) | 2023.01.13 |
[Spring] ์๋ฆผ ๊ธฐ๋ฅ์ SSE ์ ์ฉํ๊ธฐ (0) | 2022.11.25 |
[Spring] Logback ์ค์ (0) | 2022.11.16 |