โข ๋ฐ๋ธํก ํ๋ก์ ํธ์์ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ ์ฉํด ๋ณด์๊ณ ์ ์ํด ๋ณด๊ธฐ ์ํด ๊ณต๋ถํ์๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ์๋ค. ์ ์ฉํด๋ณด๊ณ ์ ํ๋ ์ด์ ๋ ๋ฐ๋ธํก์ MSA๋ก์จ Port&Adapter ์ํคํ ์ฒ์ธ ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ข์ ๊ฒ ๊ฐ์๊ธฐ ๋๋ฌธ์ด๋ค.
(1) ์ ํต์ ์ธ ๋ ์ด์ด๋ ์ํคํ ์ฒ์ ๋ฌธ์
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฃผ๋ ์ค๊ณ๋ฅผ ์ ๋ํ๋ค.
์ ํต์ ์ธ ๊ณ์ธตํ ์ํคํ
์ฒ์ ํ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ค.
์น ๊ณ์ธต์ ๋๋ฉ์ธ ๊ณ์ธต์ ์์กดํ๊ณ , ๋๋ฉ์ธ ๊ณ์ธต์ ์์์ฑ ๊ณ์ธต์ ์์กดํ๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ DB์ ์์กดํ๊ฒ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ณดํต ๊ฐ๋ฐํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชฉ์ ์ ๋น์ง๋์ค๋ฅผ ๊ด์ฅํ๋ ๊ท์น์ด๋ ์ ์ฑ
์ ๋ฐ์ํ ๋ชจ๋ธ์ ๋ง๋ค์ด์ ์ฌ์ฉ์๊ฐ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
์ด๋ ์ฐ๋ฆฌ๋ State๊ฐ ์๋๋ผ Behavior๋ฅผ ์ค์ฌ์ผ๋ก ๋ชจ๋ธ๋งํ๋ค. ํ๋์ด ์ํ๋ฅผ ๋ฐ๊พธ๋ ์ฃผ์ฒด์ด๊ธฐ ๋๋ฌธ์ ํ๋์ด ๋น์ฆ๋์ค์ ์ค์ฌ์ด๋ค.
ํ์ง๋ง ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์๊ฐํ๊ณ ์ด๋ฅผ ํ ๋๋ก ๋๋ฉ์ธ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ ์ ํต์ ์ธ ๊ณ์ธตํ ์ํคํ
์ฒ์์๋ ๋๋ฉ์ธ์ด ์์์ฑ๊ณ์ธต์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํฉ๋ฆฌ์ ์ผ ์ ์์ง๋ง ๋น์ฆ๋์ค ๊ด์ ์์๋ ๋ง์ง ์๋ค.
ORM์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋๋ฉ์ธ ๊ณ์ธต์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํฐํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์์์ฑ ๊ณ์ธต๊ณผ์ ๊ฐํ ๊ฒฐํฉ์ ์ ๋ฐํ๋ค.
2. ๊ณ์ธต์ ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ ํ ์ ์๋ค.
์ ํต์ ์ธ ๊ณ์ธตํ ์ํคํ ์ฒ์์๋ ์ ์ฒด์ ์ผ๋ก ์ ์ฉ๋๋ ์ ์ผํ ๊ท์น์, ํน์ ํ ๊ณ์ธต์์๋ ๊ฐ์ ๊ณ์ธต์ ์๋ ์ปดํฌ๋ํธ๋ ์๋์ ์๋ ๊ณ์ธต์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ง์ฝ์ ์์ ๊ณ์ธต์ ์์นํ ์ปดํฌ๋ํธ์ ์ ๊ทผํด์ผ ํ๋ค๋ฉด ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ฅผ ์๋ ๊ณ์ธต์ผ๋ก ๋ด๋ฆฌ๋ฉด ๋๋ค.
ํ์ง๋ง, ์ ๊ทธ๋ฆผ์ฒ๋ผ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์จ์ด์๋ค๊ฐ ์ ์ ์์ฌ ํฐ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
3. ๊ณ์ธต์ ๊ฑด๋๋ฐ์ด ํ
์คํธํ๊ธฐ ์ด๋ ค์์ง๋ค.
๊ฐ๋ฐํ๋ค๋ณด๋ฉด ๊ตณ์ด ์๋น์ค๋ฅผ ๊ฑฐ์น์ง ์๊ณ Repository์ ๋ฐ๋ก ์ ๊ทผํ์ฌ ๊ฐ๋จํ๊ฒ ํด๊ฒฐ ๊ฐ๋ฅํ ์ํฉ์ด ์์ฃผ ๋ฒ์ด์ง๋ค.
์ด๋ด ๊ฒฝ์ฐ ์ค๊ฐ์ ๋๋ฉ์ธ ๊ณ์ธต์ ๊ฑฐ์น์ง ์๊ณ , ์น ๊ณ์ธต์์ ์์์ฑ ๊ณ์ธต์ผ๋ก ๋ฐ๋ก ์ ๊ทผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
์ด ๋ํ ๊ณ์ธต ๊ฐ๋
์ ๋ฌด๋๋จ๋ฆด ์ ์๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
์น ๊ณ์ธต์ ๋๋ฉ์ธ ๋ก์ง์ด ๋ค์ด๊ฐ๊ฒ ๋์ด ์์ง๋๊ฐ ๋ง์ด ๋จ์ด์ง ์ ์๋ค.
๋ํ, ์น ๊ณ์ธต์ ๋จ์ ํ
์คํธํ๋ ๊ฒฝ์ฐ ์์์ฑ ๊ณ์ธต๊น์ง Mocking ํด์ผ ํ๋ ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ๋ค.
(2) ์ ํต์ ์ธ ๋ ์ด์ด๋ ์ํคํ ์ฒ์ ๋์
1. ๋จ์ผ ์ฑ ์ ์์น (SRP : Single Responsibility Principle)
"์ปดํฌ๋ํธ๋ฅผ ๋ณ๊ฒฝํ๋ ์ด์ ๋ ์ค์ง ํ ๊ฐ์ง๋ฟ์ด์ด์ผ ํ๋ค."
๋ณ๊ฒฝํด์ผ ํ ์ด์ ๊ฐ ํ๋๋ฟ์ด๋ผ๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ ๋ฑ ํ ๊ฐ์ง ์ผ๋ง ํ๊ฒ ๋๋ค.
๋ฐ๋ผ์, ์ด๋ ํ ๋ค๋ฅธ ์ด์ ๋ก๋ ํด๋น ์ปดํฌ๋ํธ์ ๋ํด์ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ค๋ ์๋ฏธ์ด๋ค.
2. ์์กด์ฑ ์ญ์ ์์น (DIP: Dependency Inversion Principle)
๊ณ์ธตํ ์ํคํ
์ฒ์์๋ ๊ณ์ธต ๊ฐ ์์กด์ฑ์ด ํญ์ ๋ค์ ๊ณ์ธต์ธ ์๋ ๋ฐฉํฅ์ ๊ฐ๋ฆฌํจ๋ค.
๋จ์ผ ์ฑ
์ ์์น์ ๊ณ ์์ค์์ ์ ์ฉํ ๋, ์์ ๊ณ์ธต๋ค์ด ํ์ ๊ณ์ธต๋ค์ ๋นํด ๋ณ๊ฒฝํ ์ด์ ๊ฐ ๋ ๋ง๋ค.
์๋ํ๋ฉด ์ ์ด ์์กด์ฑ์ ํฌํจํ์ฌ ์์ ๊ณ์ธต์ผ๋ก ๊ฐ์๋ก ์์กด์ฑ์ด ๋์ด๋๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋๋ฉ์ธ ๊ณ์ธต์ ์์์ฑ ๊ณ์ธต์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์์ฑ ๊ณ์ธต์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ ์ฌ์ ์ผ๋ก ๋๋ฉ์ธ ๊ณ์ธต๋ ๋ณ๊ฒฝํด์ผ ํ๋ค.
ํ์ง๋ง, ๋๋ฉ์ธ ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํต์ฌ์ธ๋ฐ ์ด๊ฒ์ ๋ฐ๊พธ๋ ๊ฒ์ ์ฝ์ง ์์ ์ผ์ด๋ค.
๋ฐ๋ผ์, DIP: "์ฝ๋์์ ์ด๋ ํ ์์กด์ฑ์ด๋ ๊ทธ ๋ฐฉํฅ์ ๋ฐ๊ฟ ์ ์๋ค." ์์น์ ์ ์ฉํ์ฌ ์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ํฐํฐ๋ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ํํํ๊ณ ๋๋ฉ์ธ ์ฝ๋๋ ์ด ์ํฐํฐ๋ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์ผ์ ์ค์ฌ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋จผ์ ์ํฐํฐ๋ฅผ ๋๋ฉ์ธ ๊ณ์ธต์ผ๋ก ์ฌ๋ฆฐ๋ค.
์ด์ ์์์ฑ ๊ณ์ธต์ ๋ ํฌ์งํ ๋ฆฌ์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋๋ฉ์ธ ๊ณ์ธต์ ๋์ด์ ์๋น์ค๋ ๊ฐ์ ๊ณ์ธต์ ์๋ ๋ ํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค์ ์์กดํ๋ฏ๋ก ๋ ์ด์ ๋๋ฉ์ธ ๊ณ์ธต์ ์์์ฑ ๊ณ์ธต์ ์์กดํ์ง ์๊ณ ,
์คํ๋ ค ์์์ฑ ๊ณ์ธต์ด ๋๋ฉ์ธ ๊ณ์ธต์ ์์กดํ๊ณ ์๊ฒ ๋๋ค.(์ญ์ ๋ผ๋ฒ๋ฆผ)
(3) ํด๋ฆฐ ์ํคํ ์ฒ
1. ์์กด์ฑ ๊ท์น
๋ชจ๋ ์์ค์ฝ๋ ์์กด์ฑ์ ์ธ๋ถ์์ ๋ด๋ถ๋ก, ๊ณ ์์ค ์ ์ฑ ์ ํฅํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋น์ฆ๋์ค ๊ท์น์ ํ๋ ์์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, UI ๊ธฐ์ , ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ , ์ธํฐํ์ด์ค๋ก๋ถํฐ ๋ ๋ฆฝ์ ์ผ ์ ์๋ค.
์ฌ๊ธฐ์๋ DIP์ ๋์์ผ๋ก ๋ชจ๋ ์์กด์ฑ์ด ๋๋ฉ์ธ ์ฝ๋๋ฅผ ํฅํ๊ณ ์๋ค.
ํด๋น ์ํคํ
์ฒ์ Core์๋ ์ฃผ๋ณ UseCase์์ ์ ๊ทผํ๋ ๋๋ฉ์ธ ์ํฐํฐ๋ค์ด ์๋ค.
UseCase๋ ๋ ์ด์ด๋ ์ํคํ
์ฒ์์ ์๋น์ค๋ผ๊ณ ๋ถ๋ ๋ ๊ฒ๋ค์ธ๋ฐ, SRP ์์น์ ๊ฐ๊ธฐ ์ํด ์ ์ค์ผ์ด์ค๋ณ๋ก ์ธ๋ถํ๋์ด ๊ทธ๋ ๊ฒ ๋ถ๋ฅธ๋ค.
Core ์ฃผ๋ณ์ผ๋ก๋ ๋น์ง๋์ค ๊ท์น์ ์ง์(ex: ์์์ฑ, UI)ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ด ์๋ค. ์์กด์ฑ์ด ์์ชฝ์ผ๋ก๋ง ํ๋ฆ์ผ๋ก์จ ์ธ๋ถ์ ์ํฅ์ ๋ฐ์ง ์๋ ๋๋ฉ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, ํด๋ฆฐ ์ํคํ
์ฒ์์๋ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค. ๋๋ฉ์ธ ๊ณ์ธต์ด ์์์ฑ์ด๋ UI ๊ฐ์ ์ธ๋ถ ๊ณ์ธต๊ณผ ์ฒ ์ ํ ๋ถ๋ฆฌ๋ผ์ผ ํ๋ฏ๋ก ์ํฐํฐ์ ๋ํ ๋ชจ๋ธ์ ๊ฐ ๊ณ์ธต์์ ์ ์ง๋ณด์ํด์ผ ํ๋ค.
์์์ฑ ๊ณ์ธต์์ ORM์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, DB์ ๊ด๋ จ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์ํฐํฐ๊ฐ ํ์ํ๋ค. ํ์ง๋ง, ๋๋ฉ์ธ ๊ณ์ธต์์๋ ORM์ ์ฐ๋์ง ๋ญ ์ฐ๋์ง ๊ด์ฌ์ด ์๊ธฐ ๋๋ฌธ์ ์์์ฑ ๊ณ์ธต๊ณผ๋ ๋ค๋ฅธ ์์ํ ๋๋ฉ์ธ ์ํฐํฐ๊ฐ ํ์ํ๋ค.
์ด๋ ํ๋ ์์ํฌ์ ๋๋ฉ์ธ์ ๋ถ๋ฆฌํ์ฌ ์ค๋ค.
๋ด ์๊ฐ์ ์ ๊น ๋งํ์๋ฉด ORM์ ์ฌ์ฉํ๊ธฐ๋ก ํ๊ณ ์ถํ์ ๋ณ๊ฒฝ์ฌ์ง๊ฐ ์๋ค๊ณ ํ๋จ๋๋ ๊ฒฝ์ฐ์ ํ๋ก์ ํธ์์๋ "๊ตณ์ด ์ํฐํฐ๋ฅผ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ ํ์๊ฐ ์์๊น?"๋ผ๊ณ ์๊ฐํ๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํ๋ก์ ํธ์์๋ ํด๋ฆฐ ์ํคํ ์ฒ์๋ ๋ค๋ฅด๊ฒ ํ๋๋ก ๊ด๋ฆฌํ๊ณ ์ ํ๋ค.
(4) ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ
์ก๊ฐํ ์ํคํ ์ฒ ๋๋ Port&Adapter ์ํคํ ์ฒ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋๋ฐ, ํด๋ฆฐ ์ํคํ ์ฒ์์ ์กฐ๊ธ ๋ ์ผ๋ฐ์ ์ธ ์ฉ์ด๋ก ์ค๋ช ํ ์ํคํ ์ฒ์ด๋ค.
์ก๊ฐํ ๋ด์๋ ๋๋ฉ์ธ ์ํฐํฐ์ ์ด์ ์ํธ์์ฉํ๋ UseCase๊ฐ ์กด์ฌํ๋ค. ์ก๊ฐํ์์ ์ธ๋ถ๋ก ํฅํ๋ ์์กด์ฑ์ด ์๊ธฐ ๋๋ฌธ์ Clean Architecture์์ ์ ์ํ ์์กด์ฑ ๊ท์น์ด ๊ทธ๋๋ก ์ ์ฉ๋์ด ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์ก๊ฐํ ๋ฐ๊นฅ์๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์ํธ์์ฉํ๋ ์ฌ๋ฌ ๊ฐ์ง ์ด๋ํฐ๊ฐ ์กด์ฌํ๋ค.
์น ๋ธ๋ผ์ฐ์ ์ ์ํธ์์ฉํ๋ ์น ์ด๋ํฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํ๋ ์น ์ด๋ํฐ, ์ธ์ปค๋ฐ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ํฐ, ์์๊ณ ์ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ํฐ๊ฐ ์กด์ฌํ๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ์ด์ ์ธ๋ถ์ ์ด๋ํฐ ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํ๋ ค๋ฉด ํฌํธ๊ฐ ํ์ํ ๊ฒ์ด๋ค.
์ธ์ปค๋ฐ ์ด๋ํฐ์๊ฒ๋ ํฌํธ๊ฐ ์ฝ์ด์ ์๋ ์ ์ค์ผ์ด์ค ํด๋์ค ์ค ํ๋์ ์ํด ๊ตฌํ๋๊ณ ์ด๋ํฐ์ ์ํด ํธ์ถ๋๋ ์ธํฐํ์ด์ค๊ฐ ๋๋ค.
์์๊ณ ์ ์ด๋ํฐ์๊ฒ๋ ํฌํธ๊ฐ ์ด๋ํฐ์ ์ํด ๊ตฌํ๋๊ณ ์ฝ์ด์ ์ํด์ ํธ์ถ๋๋ ์ธํฐํ์ด์ค๊ฐ ๋๋ค.
๋ค์ ํธ์์ ๊ณ์๋ฉ๋๋ค.
'๐จโ๐ฉโ๐งโ๐ฆ Project > ๐ฉ DevTalk' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Repository์์ CQS๋ฅผ ํฌ๊ธฐํ๊ณ ์์ ํ ๊ณผ์ (0) | 2023.07.13 |
---|---|
CQS๋ฅผ ๊ณ๋ค์ธ ํฅ์ฌ๊ณ ๋ (Hexagonal) ์ํคํ ์ฒ ํจํค์ง ๊ตฌ์กฐ์ ํด๋์ค ๋ค์ด๋ฐ (0) | 2023.07.07 |