DDD-Lite@Spring
by JiwonDevhttps://www.youtube.com/watch?v=TdyOH1xZpT8
๐ ๋ณต์ก์ฑ
๊ธฐ์ ์ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๋๋ฐ ๊ฐ๋ฐ์๋ ์ ๊ณ์ ๊ณ ํต๋ฐ๋๊ฐ
- ์ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ๊ฐ๋ฉด ๊ฐ์๋ก ๋ ํ๋ ๊ฐ
- ์ ์ ์ง ๋ณด์ ๋น์ฉ์ ๋์์์ด ์ฆ๊ฐํ๋๊ฐ
- ์ง์ง ์ค์ํ๊ฒ ๋์ฒด ๋ฌด์์ธ๊ฐ
๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ ๊ตฌ์ถํ๋ค๋ณด๋, ์๋น์ค๊ฐ ์ปค์ง๋ฉด ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์๊ณ ๋ค์ ์์ํด์ผํ๋ค.
๋ฌผ๋ก ๊ฐ์ ์ ํฌ๊ธฐํ๊ณ , ํ์ฌ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ํ์ง๋ง ๋ณํ์ ์ ์ํ์ง ๋ชปํ๋ฉด ๋น์ฆ๋์ค๋ ๋ํ๋๋ค.
๐ DDD (Domain Driven Architecture)
ํฐ ํ๋ก์ ํธ์ ํต์ฌ์ ๋ฝ์๋ด์ ์ธ๋ถ ๋๋ฉ์ธ์ผ๋ก ๋ถ๋ฆฌํ์.
- ํต์ฌ ๋๋ฉ์ธ: ๋น์ฆ๋์ค์ ํต์ฌ์ด ๋๊ณ , ๊ฐ์ฅ ์ด๋ ต๊ณ ๋ณต์กํ ๊ณณ(์ผํ๋ชฐ โก ๊ฒฐ์ , ์ผํ )
- ์ง์ ๋๋ฉ์ธ: ํต์ฌ ๋๋ฉ์ธ์ ๋์์ฃผ๋ ๊ธฐ๋ฅ. ๋ถ๊ฐ์๋น์ค (์ผํ๋ชฐ โก ์ ํ ์กฐํ, ๋ฐฐ์ก ์กฐํ)
- ์ผ๋ฐ ๋๋ฉ์ธ: ๋๋ถ๋ถ์ ๋น์ฆ๋์ค์์ ํ์ํ ๊ธฐ๋ฅ (๊ณ์ , ์ด๋ฉ์ผ... ์์ฉ์๋น์ค๋ก ๋์ฒด ๊ฐ๋ฅ)
DDD๋ ์ฌ๊ธฐ์์ 'ํต์ฌ' ๋๋ฉ์ธ์ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐ญ ์๊ตฌ์ฌํญ์ ํตํด ๊ตฌ์ถํ๋ฉฐ ๋ฐฐ์๋ณด์.
dooray ์ํค์ ๊ฐ๋ตํ ๋ฒ์
๐ Entity ์ค๊ณ
์ํฐํฐ? - ์๋ณ(ID)ํ ์ ์๊ณ , ์๋ช ์ฃผ๊ธฐ๊ฐ ์๋ค.
๋๋ฉ์ธ์ด ํ๋ถํด์ง๋ ค๋ฉด ๊ณ ์์ค์ ํ์๊ฐ ๋๋ฉ์ธ์ ํํํ ์ ์์ด์ผํ๋ค.
์์ฑ์ ํ์๊ฐ ํ์ํ ๋ ์ ์ํ๋ค. ๊ตฌ์ฒด์ ์ธ ์ฌํญ์ ๋จผ์ ๊ตฌํํ์ง ๋ง๋ผ. DB ํ ์ด๋ธ์ ๋จผ์ ๋ง๋ค์ด๋๊ณ ๋ฐ๋ผ์ ๋ง๋ค์ง๋ง๋ผ (๋จ์ DAO ์ฌ์ฉ, ๋น์ฝํ ๋๋ฉ์ธ ๋ชจ๋ธ)
์๋ณ์ฑ์ ์กด์ฌํ์ง๋ ์์ง๋ง, ๋๋ฉ์ธ์ ํน์ ์์ญ์ ์ถ์ํ ์ํค๋ ๋ฐ์ดํฐ : ๊ฐ ๊ฐ์ฒด
๊ฐ ๊ฐ์ฒด๋ฅผ ์ ์ฉํ ์ ์๋ ๋์ : prefix๊ฐ ๊ฐ์ ๊ฒ
๊ฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋๊ณ , ๋ ์กฐํฉํ ์ ๋ ์๋ค. (๊ฐ ๊ฐ์ฒด์์ ์ํฐํฐ๊ฐ ์์ด๋ ๋๋ค)
Aggregate : ๋๋ฉ์ธ์ ๋ถ๋ณ์(๋ฐ์ดํฐ ์ผ๊ด์ฑ)์ ๋ํ๋ด๊ธฐ์ํด ์ฌ์ฉ. ๋ฐ์ดํฐ ๋ณ๊ฒฝ(ํธ๋์ญ์ )์ ๋จ์
์ด๊ธฐ์ค๊ณ๋ ๋ฌด์ง์ฑ์ผ๋ก ๋ง๋ฆ. ํ์ด์ง๋๊น PageUser๋ ๊ฐ์ด ๋ฌถ์ผ๋ฉด ๋๊ฒ ์ง?
โก ํ์ง๋ง ์๊ณ ๋ณด๋ฉด PageFile์ ์ ์ฆ์ผ์ด์ค๊ฐ ๋ค๋ฆ. ํ์ด์ง๋ฅผ ์๊ฑฐ์น๊ณ ๋ค์ด๋ก๋ํ ์๋ ์์ ํธ๋์ญ์ ๋ฒ์๊ฐ ๋ค๋ฆ
๐ ์ํค ๋ช ์ธ๊ฐ ์ถ๊ฐ๋์๋ค. (์๊ตฌ์ฌํญ ์ถ๊ฐ)
ํ์ง๋ง ๋ณดํต ๋น์ฆ๋์ค ํต์ฌ ๋๋ฉ์ธ์ ์ด๋ ๊ฒ ๊ฐ๋จํ์ง ์๋ค. ํ๊ณ ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
ํ์ด์ง๊ฐ ๋ณ๊ฒฝ๋๋ ์ฌ๊ฑด(Event)
๐ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ์ฃ
Spring-Data๋ก ํ๋ฉด ๊ฐ๋จํ๊ฒ ๊ฐ๋ฅํ์ง๋ง, 'ํธ๋ฆฌ๊ฑฐ'๊ฐ ์์ด์ผ ํ๋ค. ( ์ ๋ฐ์ดํธ ์ดํ Repository.save() ํ์ )
์คํ๋ง ๋๋ฉ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๊ณต์๋ฌธ์
์ต๋ฒ๊ท - ๋๋ฉ์ธ ์ด๋ฒคํธ ์ฒ๋ฆฌ
๐ DDD๋ฅผ ํตํ ๋ค์ด์ดํธ
์ฑ ๋ก์ง๊ณผ ๋๋ฉ์ธ์ ๋ถ๋ฆฌํ๋ผ.
ํ์๋ง ๊ฐ์ง๊ณ ์๋ ๋๋ฉ์ธ ์๋น์ค๋ฅผ ๋ง๋ค์.
์๋น์ค๋ ๋ญ๋ค?
์์ฑ์์ด ํ์๋ง ์๋ ๊ณณ.
์ด๋ฒคํธ ๋๋ฆฌ๋ธ(๋ฐํ-๊ตฌ๋ )๋ชจ๋ธ์ ๊ฐ์ฅ ํฐ ๋จ์ ์ ์คํ์์๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค๋ ๊ฒ.
๋๊ฐ ํธ์ถํ๋์ง ์ถ์ ์ด ์ด๋ ต๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด docs๋ฅผ ๋ฌ์์ฃผ๋๊ฒ ์ข๋ค.
์ฐธ๊ณ ๋ก Spring์ @Repository๋ DDD ์ฉ๋๋ก ๋ง๋ ๊ฒ ๋ง๋ค. ์ค์ Docs์ ๊ทธ๋ ๊ฒ ์ฐ์ฌ์์๋๋ฐ
์ดํ DDD๋ง๊ณ ๊ทธ๋ฅ ์์์ฑ ์์ญ์ผ๋ก ์ฌ์ฉํ๋ ๊ณณ๋ ์์ผ๋ ์ฝ๊ฐ ์ค๋ช ์ด ๋์จํ๊ฒ ๋ฐ๋์๋ค๊ณ ํ๋ค.
JpaRepository์ ๋ชจ์์ด ๋น์ทํ๋ค๋ฉด ๊ทธ๋ฅ ์ฐ๋๊ฒ ์ข์ง๋ง
Repository ๋ฉ์๋๊ฐ ๋ช๊ฐ์๋ค๋ฉด..๊ตณ์ด ์คํ๋ง์ ์์กดํ ํ์ ์์๊น.
๊ทธ๋ฅ ์์์๋ฐ์ฝ๋๋ก ์ง๋ ๊ฒ๋ ๊ณ ๋ คํด๋ณด๋๊ฒ ์ข๋ค.
๐ญ ์ํคํ ์ฒ์ ๋ชจ๋
Layerd Architecture๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋ค.
Hexagonal Architecture๋ฅผ ์ถ์ฒ.
์ด๋ํฐ๋ ๋ฐ์ธ๋ฉ ํต๋ก
Primary Adapter ๋ ์์ฒญ-์๋ต์ ๋ํ ์ด๋ํฐ (Rest Api, batch ๋ฑ)
Secondary Adapter๋ ๊ธฐ์ ์ ์ฒ๋ฆฌ์ ๋ํ ํต๋ก (๋ค๋ฅธ ์ธํ๋ผ ํธ์ถ, ์์ํDB, Redis์บ์ฑ, ๋ฉ์์ง ๋ฑ)
Domain์ ๋๋ฉ์ธ ๋ชจ๋ธ
Application์ ์๋น์ค
Layerd Architecture๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋ค.
๋๋ฉ์ธ์ด ์ธํ๋ผ์ ์์กดํ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ. ์ฆ ๋๋ฉ์ธ์ ๊ด์ฌ์ฌ์ ๊ธฐ์ ์ ๊ด์ฌ์ฌ๊ฐ ์์ธ๋ค.
= ๋ณต์ก์ฑ์ด ์ฎ์ด๋ฒ๋ฆฐ๋ค. ๋๋ฉ์ธ๊ณผ ๊ธฐ์ ์ ๊ด์ฌ์ฌ, ์๋น์ค(์ฑ) ๊ด์ฌ์ฌ๋ฅผ ์์ ํ ๋ถ๋ฆฌํด์ผํ๋ค.
์ด๋ํฐ์ชฝ๋ง ์ดํด๋ณธ๋ค๋ฉด ์๋์ ๊ฐ๋ค.
์ฐธ๊ณ ๋ก Spring Configuration๋ ๊ธฐ์ ์ผ๋ก ๋ณผ ์์์ด์, ์ด๋ํฐ์ชฝ์ ๋๋๊ฑธ ์ถ์ฒํ๊ธดํ์ง๋ง..๋ญ ๊ธฐ์กด์ฒ๋ผ ์ต์์ ๋ฃจํธ์ ๋๊ณ ์ฌ์ฉํด๋ ์๊ด์์๋ค.
๋ค์ด์ค๋ ํต๋ก = ํ๋ผ์ด๋จธ๋ฆฌ ์ด๋ํฐ
rabbitMq๋ ํ๋ผ์ด๋จธ๋ฆฌ, ์ธ์ปจ๋๋ฆฌ ๋ ๋ค ํฌํจ๋๋ค. (์ด๋ฒคํธ๋ฅผ ๋ฐ์๋ ์ค์ผํ๋๊น)
๋ ์ด์ด๋ ์ํคํ ์ณ๋ ์๋ฆญ ์๋ฐ์ค ์์ ์ ์ ๋ฌผ์ด๋ค.
ํฅ์ฌ๊ณค์ผ๋ก ๊ฐ์ญ์ผ..ใ ใ
๋๋ฉ์ธ์ด ๋จผ์ ๋ค.
๊ฐ๋ฐ์๊ฐ ์์ฌํ ๋ง๋ค๋ณด๋ ๊ธฐ์ ๋ถํฐ ์ ํด๋๊ณ ๋๋ฉ์ธ์ ๋ง์ถ๋๊ฒฝ์ฐ๊ฐ๋ง๋ค.
๋ฌผ๋ก ํธ๋ ์ด๋ ์คํ๊ฐ ์๋ค.
DDD๋ ๋ณต์ก๋๊ฐ ์ผ์ ํ๊ฒ ์ ์ง๋๋ค. ๊ทธ๋ฌ๋ ํ์ต๊ณก์ ์ด ์๋ค.
๊ณจ๋ ํฌ๋ก์ค (์ดํ๋ฆฌ์ผ์ด์ ์ ์๊ธฐ)๋ฅผ ๋ง๋ณด์๋ค๋ฉด DDD๊ฐ ์ ํ์ํ์ง ๋๋ ๊ฒ์ด๊ณ , ๊ทธ๊ฒ ์๋๋ผ๋ฉด ๊ผญ ํ์ํ์ง ์๋ค.
DDD Lite๋ ์์ ์คํญ์ด ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค.
'๐์ผ์ > ๋ฉํ ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ (0) | 2021.11.17 |
---|---|
Spring JPA์ ์ฌ์ค๊ณผ ์คํด (0) | 2021.11.15 |
์ฐ์ํ ๋ชจ๋ ธ๋ฆฌ์ค (0) | 2021.11.13 |
์์กด์ฑ์ ์ด์ฉํด ์ค๊ณ ์งํ์ํค๊ธฐ (0) | 2021.11.13 |
์ก์๋ฆฌ3 (0) | 2021.11.12 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev