๐คฉ ํด๋ฆฐ ์ํคํ ์ฒ
๊ฐ์
Robert C. Martin์ Clean Architecture๋ฅผ ์ฝ๊ณ , ๋๋ฆ์ ์ดํด๋ฅผ ์ํ ๋ ธ๋ ฅ๊ณผ ์ค์ ํ๋ก์ ํธ์๋ ์ด๋ป๊ฒ ์ ์ฉํ ๊ฒ์ธ์ง์ ๋ํ ๊ณ ๋ฏผ์ ๋ํด ํฌ์คํ ํ๋ ค ํ๋ค.
(์ ๋ฆฌ์ ๋ณ๊ฐ๋ก ๊ฐ์ธ์ ์ธ ์๊ฐ์ด ๋ค์ด์์ด ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค.)
(๋ค๋ฅธ ์ ์ ๋ํด์๋ ์๊ฒฌ์ ๊ณต์ ํด๋ณด๊ณ ์ถ์ต๋๋ค!!)
The Clean Architecture ํฌ์คํธ
ํด๋ฆฐ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ๋ ์ด์
ํ์ํ ๋ถ๋ถ (Infra)๋ง ๋ฐ๊ฟ๋ ํ๋ก์ ํธ ์์ ๋ฌธ์ ๊ฐ ์๋๋ค.
- ์์ค ์ฝ๋ ์์ ์ฑ โ
- ์ฝ๋ ๊ฐ๋ ์ฑ โ
- ์ ์ง ๋ณด์์ฑ โ
๋ค๋ง, ํ๋ก์ ํธ๊ฐ ๊ธํ ์ํฉ์ด๋ผ๋ฉด ์ฒ์ฒํ ์ค๊ณ๋ฅผ ํด๋๊ฐ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ฌ์ค ์ ์งํค๊ธฐ ์ด๋ ต๋ค.
๋ด์ฉ
๐ก ์ํคํ ์ฒ์ ์ ์ฝ ์กฐ๊ฑด
ํฌ์คํธ์์๋ ๋๋ถ๋ถ์ ์ํคํ ์ฒ(Hexagonal, Onion ๋ฑโฆ)๋ ์ธ๋ถ์ฌํญ(๋น์ฆ๋์ค ๋ก์ง)์ ๋ฌ๋ผ๋ ๊ณตํต์ ๋ชฉํ๋ ๊ณ์ธต์ ๋ถ๋ฆฌํ์ฌ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค.
์ ์ด๋ฏธ์ง์์ ๋ฐ๊นฅ์ชฝ ์์ ๋ฉ์ปค๋์ฆ์, ๋ด๋ถ ์์ ์ ์ฑ
์ ์๋ฏธํ๋ค.
๋ฐ๊นฅ-> ์์ผ๋ก ๊ฐ์๋ก ๊ณ ์์ค์ ์ํํธ์จ์ด๊ฐ ๋๋ค.
์ด๋ฌํ ์ํคํ ์ฒ๋ค์ ์ ์ฝ์กฐ๊ฑด์ ๋ค์์ผ๋ก ์ ๋ฆฌํ ์ ์๋ค.
- ํ๋ ์์ํฌ์ ๋ฌด๊ดํ๋ค.
- ๋ค์ํ ํ๋ ์์ํฌ๋ฅผ ๋๊ตฌ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.
- ๋น์ฆ๋์ค ๊ท์น์ UI, DB๋ฑ ์ธ๋ถ์์ ์์ด
ํ ์คํธ
๊ฐ๋ฅํด์ผ ํ๋ค. - UI์ ๋ฌด๊ดํด์ผ ํ๋ค.
- DB์ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ค.(Mysql, Oracleโฆ)
- ๋น์ฆ๋์ค ๋ก์ง์ ์ธ๋ถ ์์์ ๋ฌด๊ดํ๊ฒ
๋์
ํด์ผ ํ๋ค.
์ด๋ฌํ ์ํคํ
์ฒ๊ฐ ๋์ํ๊ธฐ ์ํด์๋ (== ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด์๋) ์์กด์ฑ ๊ท์น
์ ๋ฐ๋ผ์ผ ํ๋ค.
๐ก ์์กด์ฑ ๊ท์น
์์กด์ฑ ๊ท์น์ ๋ชจ๋ ์์ค์ฝ๋ ์์กด์ฑ์ ์ธ๋ถ -> ๋ด๋ถ ์ฆ, ๊ณ ์์ค์ ์ ์ฑ ์ ํฅํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
๊ณ ์์ค : ์ถ์ํ๋ ๊ฐ๋
- ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- ์ด ๊ทผ๋ฌด ์๊ฐ์ ๊ตฌํ๋ค.
์ ์์ค : ์ธ๋ถํ๋ ๊ฐ๋
- mysql์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- A์ฌ์ฉ์์ ๊ทผ๋ฌด์๊ฐ์ ๋ค ๋ํ๋ค.
์์ ๊ทธ๋ฆผ์์ Domain Layer๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์กด์ฌํ๋ ์์ญ์ด๋ค. (๊ณ์ฐ๊ธฐ๋ ๊ณ์ฐ์, ์ผํ๋ชฐ์ ๋ฌผ๊ฑด์ ํ๋งค๋ฅผ)
๋น์ฆ๋์ค์ ๋ณธ์ง์ ์ฝ๊ฒ ๋ฐ๋์ง ์์ผ๋ฏ๋ก ์ ๋ณํ์ง ์๋ ์์ญ์ด๋ค.
Infra Layer๋ UI, Framework ๋ฑ์ด ์กด์ฌํ๋ ์์ญ์ด๋ค.
Infra๋ ์์ฃผ ๋ฐ๋์ด๋ ๋ด๋ถ ๋ก์ง์ ๋ฐ๋์ง ์๋๋ค. (๊ณ์ฐ ๋ฒํผ์ ์์ ๋ฐ๋์ด๋ ๊ณ์ฐ๊ธฐ์ ๊ณ์ฐ์ด ๋ฐ๋์ง ์๋๋ค.)
๊ณ ์์ค ์ ์ฑ
์ธ Domain์ ์ ์์ค ์ ์ฑ
์ธ Infra์ ๋ํด ์๋ฌด๊ฒ๋ ๋ชฐ๋ผ๋ ๋๋ค.
์ด๋ ๊ฒ Layer๋ฅผ ๊ตฌ๋ถํ์ฌ Infrastructure๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค.
Martin์ ์ํคํ
์ฒ๋ 4๊ฐ์ ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋์ด์๋ค.
Entities
์ ์ฌ์ ๋น์ฆ๋์ค ๊ท์น์ ๋ด๋๋ค.
์ด๋ ๋๊ท๋ชจ ํ๋ก์ ํธ ๋ด์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ๋ . ์์๋ค.(์ ํ๋ฆฌ์ผ์ด์
์ ์ข
์X)
๊ฒ์์ผ๋ก ์น๋ฉด ๋ชฌ์คํฐ, ์์ดํ ๋ฑ์ ์์ธ ์ ๋ณด ์ถ์ ํต์ ๋ก ์น๋ฉด ๋จ๋ง๊ธฐ, ์ ์ , ๋ฌธ์ ์์ธ ์ ๋ณด ์ ๋ฌด ๋ณด๊ณ ์๋น์ค๋ก ์น๋ฉด ์ ๋ฌด ๋ณด๊ณ ์
(๋ฐ๋์ง ์๋ ๋ถ๋ถ์ด๋ผ ํ์ง๋ง, ์ฌ์ค ๋ด๋ถ ์ฌ์ ์ ์ํด ๋ง์ด ๋ฐ๋๋คโฆ๐ญ)
Use Cases
์ ํ๋ฆฌ์ผ์ด์
๋ณ ๋น์ฆ๋์ค ๊ท์น์ ๋ด๋๋ค.
์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ํตํด ํ๊ณ ์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ฒ์
- ๋ชฌ์คํฐ๋ฅผ ์ฌ๋ฅํ๋ค.
- ์์ดํ ์ ์ฅ์ฐฉํ๋ค.
์ถ์ ํต์
- ๋จ๋ง๊ธฐ์ ์ธ์ฆํ๋ค.
- ๋จ๋ง๊ธฐ๋ฅผ ์ ์ดํ์ฌ ๋ฌธ์ ์ฐ๋ค.
์ ๋ฌด ๋ณด๊ณ ์๋น์ค
- ์ผ์ผ ์ ๋ฌด๋ณด๊ณ ๋ฅผ ๋ฑ๋กํ๋ค.
- ์ ๋ฌด ๋ณด๊ณ ๋ฅผ ์กฐํํ๋ค.
- ์ฃผ๊ฐ ๋ณด๊ณ ๋ฅผ ์์ฑํ๋ค.
Interface Adapter
์ด๋ํฐ ๊ณ์ธต์ Infra ์ธก์์ ์ฌ์ฉํ๊ธฐ ํธํ๋๋ก Use Case ํน์ Entities์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ ๊ณ์ธต์ด๋ค.
๋ณดํต MVC, MVVM์ ์ํคํ
์ฒ๋ฅผ ํฌํจํ๋ ์์ญ์ผ๋ก Controller, Presenter ๋ฑ์ด ์ํ๋ค.
Framework && Driver
Infra ๊ณ์ธต์ด๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค.
DB, Framework ๋ฅผ ํฌํจํ๋ค. ๋ณดํต ๋ด๋ถ์ ๋นํด ๋ณํ๊ฐ ์ฆ๋ค.
๐ก ์์กด์ฑ ๊ท์น์ ์งํค๋ ๋ฐฉ๋ฒ
What data crosses the boundaries
๊ฒฝ๊ณ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๋ฌด์์ ์ ๋ฌํด์ผํ๋๊ฐ์ ๋ํ ์ด์ผ๊ธฐ๋ค.
์์กด์ฑ์ ์งํค๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ต๋ํ ๋จ์ํ๊ฒ ์ ์งํ์ฌ ๊ฐ ์์คํ
์ด ๋
๋ฆฝ์ ์ผ๋ก ๋ณํํ ์ ์๋๋ก ํด์ผํ๋ค.
Crossing boundaries
์ค์ ์์คํ
์ ํ๋ฆ์ ์ฌ์ฉ์์ ์์ฒญ -> ์๋ต์ด๋ค.
์ด ํ๋ฆ์ ์์์ ์ธ๋ถ -> ๋ด๋ถ -> ์ธ๋ถ์ธ๋ฐ, ์ด๋ ์ํคํ
์ฒ์ ์์กด์ฑ ๊ท์น์ ์๋ฐฐ๋๋ค.
์ด ๋ถ๋ถ์ด ๋ง์ด ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด์๋ค.
์ํคํ
์ฒ์ ๋์ฌ์์์๋ repository๊ฐ ๋ ๋ฐ๊นฅ๋ถ๋ถ์ด์ง๋ง, ์ค์ ํ๋ฆ์์๋ usecase๊ฐ ๋ ๋ฐ๊นฅ๋ถ๋ถ์ธ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, usecase๊ฐ repository๋ฅผ ํธ์ถํ๋๊ฑด ์์กด์ฑ ๊ท์น์ ์๋ฐฐ๋๊ณ ์ด๋ฅผ DIP๋ฅผ ํตํด์ ํด๊ฒฐํด์ผํ๋ค๋ ์ด์ผ๊ธฐ๋ค.
๐ Conclusion
์ํํธ์จ์ด์ ์ผ์ ์ฃผ๊ธฐ์์ ๊ฐ์ฅ ๋น์ฉ์ด ๋ง์ด๋๋ ์ฃผ๊ธฐ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ฃจ์ด์ง๋ ๋จ๊ณ์ด๋ค. ์ ๊ตฌ์กฐํ๋๊ณ ์ถ์ํ๋ ์ํํธ์จ์ด ์์คํ ์ ์ ์ง๋ณด์ ํ๊ธฐ ์ฝ๋ค. ์ด๋ ์ฌ์ฉ์์ ์๊ตฌ์ฌํญ์ ๋ฐ์๋ค์ด๊ธฐ ์ฌ์ ์๋ก์ด ๊ฐ์น๋ฅผ ๋ง๋ค์ด๋ด๊ธฐ ์ฝ๋ค๋ ์๋ฏธ๋ค.
ํด๋ฆฐ ์ํคํ ์ฒ๋ ์ด๋ฌํ ๋ชฉํ๋ฅผ ์ด๋ฃจ๊ธฐ ์ํด ๋๋ฆฌ ํผ์ง ํ๋์ ๋ฐฉ๋ฒ๋ก ์ด๋ค. ํด๋ฆฐ ์ํคํ ์ฒ์์ ์ ์ํ๋ ๋ชจ์ต์ ์์์ผ๋ก ์ข์ ์ํํธ์จ์ด ์ํคํ ์ฒ๋ฅผ ์ด๋ป๊ฒํ๋ฉด ๊ตฌ์ฑํ ์ ์์์ง๋ ๊ณ์๋ ์์ ๋ก ๊ฐ์ง๊ณ ๊ฐ์ผํ ๊ฒ ๊ฐ๋ค.