์ด๋ฒ ํฌ์คํ ์์๋ Android ๊ฐ๋ฐ์์ ์ clean architecture๋ฅผ ์ฌ์ฉํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ clean architecture์ ๊ดํด์ ๊ถ๊ธํ๋ ๊ฒ๋ค์ ๊ณต๋ถํด์ ์ ์ด ๋ณด๊ณ ์ ํ๋ค.
๋ด๊ฐ ๊ณต๋ถํ๋ฉด์ ์ฐธ๊ณ ํ ํฌ์คํ ๋ ํจ๊ป ๋จ๊ธธ ํ ๋ ๋ํ ๋ด์ฉ์ด ๊ถ๊ธํ๋ฉด ํ์ธํด ๋ณด๋ ๊ฒ๋ ์ข๊ฒ ๋ค.
clean architecture์ ์ ์
์ ์๋ ๋ค๋ฅธ ํฌ์คํ ์๋ ์์ฃผ ์ธ๊ธ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ฒ ๋ค.
clean architecture๋ ์ํํธ์จ์ด ์์คํ ์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ๋ ์ง์ผ์ผ ํ ์์น๊ณผ ๋ฐฉ๋ฒ์ ์ ์ํ ๊ฐ๋ .
๋ณต์กํ ์ํํธ์จ์ด ์์คํ ์ ๋ณด๋ค ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ์ ์ง ๋ณด์ ๊ฐ๋ฅํ ํํ๋ก ๊ตฌ์ถํ๊ธฐ ์ํ ์ง์นจ์ ์ ๊ณตํ๋ค.
๊ฐ๋จํ๊ฒ ์์ฝํ์๋ฉด, ๊ท๋ชจ๊ฐ ํฐ ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ ๋ ์ง์ผ์ผ ํ๋ ๊ตฌ์กฐ ๊ฐ์ ๊ฑฐ๋ผ๊ณ ์ดํดํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ์ ์ฐ๋๊ฐ?
์ฒ์์ ์ด ๊ฐ๋ ์ ์ ํ์ ๋๋ ๊ทธ๋ฅ ์ข๊ตฌ๋ ํ๊ณ ์ฌ์ฉํ๋ ๊ธฐ์ต์ด ์๋ค.
์๊ฐ์ด ํ๋ฅด๊ณ ๋๋๊น ์ ์ด ๊ฐ๋ ์ ์ ์ฉํด์ผ ํ๋์ง ๊ถ๊ธํด์ก๋ค.
์๋๋ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํด์ ํ ์คํธ ์ฉ์ด์ฑ์ ๋์ผ ์ ์์ด์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์๊ณ ์์๋ค.
์ด๊ฒ๋ ์ ๋ต์ด์ง๋ง, ๋ค๋ฅธ ์ด์ ๊ฐ ๋ ์๋๋ผ.
- ํ์ฅ์ฑ
๊ณ์ธต ๊ฐ์ ๋ถ๋ฆฌ๋ก ๋ถ์์ฉ ์์ด ์์คํ ์ ํ์ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
โณ ๋ํผ์ ์ด์ง๋ง ์ด๋ multi module์ ์ด์ฉํด feature(๊ธฐ๋ฅ) ๋ณ๋ก module์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค. - ์ฌ์ด ํ์
๊ตฌ๋ถ๋ ๊ณ์ธต๊ณผ ๊ฐ ์ฑ ์์ ๋ฐ๋ผ ๋ค์ด๋ฐ ๋ ํ์ผ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ํน์ ์ฝ๋๋ฅผ ๊ฒ์ํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค.
โณ clean architecture๋ฅผ ์ ์ฉํด ๋ณธ ๊ฒฝํ์ด ์๋ค๋ฉด ์ถฉ๋ถํ ๊ณต๊ฐํ ์ ์์ ๊ฒ์ด๋ค. - ํ์
์ฉ์ด์ฑ
์ ์ ์๋ clean architecture๋ ํ์ด ์ฑ์ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ๋์์ ์์ ํ๊ธฐ๊ฐ ์ฉ์ดํ๋ค.
โณ ์์ ์ด ๋งก์ ๊ธฐ๋ฅ์ clean architecture๋ก ๊ตฌํํ๋ฉด ๋ค๋ฅธ ํ์์ ์ฝ๋๋ฅผ ์นจํดํ๋ ๊ฒฝ์ฐ๋ฅผ ์ค์ผ ์ ์๋ค.
๋ค๋ฅธ ์ฅ์ ๋ค๋ ๋ง์ง๋ง ๋ด๊ฐ ๊ฐ์ฅ ๊ณต๊ฐ์ด ๊ฐ๋ ์ฅ์ ๋ค๋ก ๊ฐ์ ธ์ ๋ดค๋ค.
์ถ๊ฐ์ ์ธ ์ฅ์ ๋ค์ด ๊ถ๊ธํ๋ฉด ์๋ ํฌ์คํ ์ ํ์ธํด ๋ณด์.
์ฐธ๊ณ ํฌ์คํ 1, ์ฐธ๊ณ ํฌ์คํ 2
๊ทธ๋ฌ๋ฉด clean architecture๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ์ ๊ตฌํํ๋ค๊ณ ๋งํ ์ ์์๊น?
๋ฐ๋ก solid ์์น์ ์ค์ํ๋ฉด์ clean architecture๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด๋ค.
clean architecture์ solid ์์น
clean architecture์ solid ์์น๊ณผ ๊น์ ์ฐ๊ด์ด ์๋ค.
clean architecture๋ฅผ ๊ตฌํํ๋ฉด์ solid ์์น์ ์ค์ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ๋จ์ผ ์ฑ
์ ์์น(SRP)
ํด๋์ค๋ ํ๋์ ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ค. ํ๋์ ํด๋์ค์ ํ๋์ ํจ์๋ง ์กด์ฌํด์ผ ํ๋ค๋ ๊ฒ์ด ์๋. ํด๋์ค์ ์ฃผ์ ๊ฐ ์ฃผ์ฒด๊ฐ ๋์ด์ผ ํ๋ค
ex) ๋์๊ด์ ์๋ก ๋ค๋ฉด, ๋์ถ ๋ฐ ๋ฐ๋ฉ์ ๊ด๋ฆฌํ๋ ํด๋์ค์์๋ ๋์ถ, ๋ฐ๋ฉ ํจ์๋ง, ๋์ ์ฌ๊ณ ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค์์๋ ๋์ ์ถ๊ฐ, ์ญ์ ํจ์๋ง ์์ด์ผ ํ๋ค.
โณ clean architecture์์๋ ๊ฐ ๊ณ์ธต์๊ฒ ๋ช ํํ ์ฑ ์์ ๋ถ์ฌํด์ผ ํ๋ค. ๊ฐ์ ๊ณ์ธต์ด์ด๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ ํํ ๊ตฌ๋ถํด ์ฃผ์ด์ผ ํ๋ค. - ๊ฐ๋ฐฉ-ํ์ ์์น(OCP)
ํ์ฅ์๋ ๊ฐ๋ฐฉ์ ์ด์ง๋ง ์์ ์๋ ํ์์ ์ด์ด์ผ ํ๋ค. ์ฆ, ์์ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ํด๋์ค์ ๋์์ ํ์ฅํ ์ ์์ด์ผ ํ๋ค.
โณ clean architecture์์๋ ๊ธฐ์กด ๊ตฌํ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ด์ ํจ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. - ๋ฆฌ์ค์ฝํ ์นํ ์์น(ISP)
์์๋๋ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ์ญํ ์ ์์ ํ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค.
ex) ์ง์ฌ๊ฐํ์ ๋์ด ๋๋น๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ง๋ง, ์ ์ฌ๊ฐํ์ ๋์ด์ ๋๋น๊ฐ ํจ๊ป ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ ์ ์ฌ๊ฐํ์ ์ง์ฌ๊ฐํ์ ํ์ ํ์ ์ผ๋ก ์ ์ ํ์ง ์๋ค.
โณ repository๊ฐ data source์ ์์๋ค ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํด๋ ๋์ผํ ์ญํ ์ ํด์ผ ํ๋ค.
์์์ ํตํด ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ๋ฉค๋ฒ ๋ณ์์ฒ๋ผ ๊ฐ์ง๊ณ ์์ผ๋ฉด ์์ํ์ง ๋ชปํ ํ์ฅ์ด ์ผ์ด๋ฌ์ ๋๋ ๋ฉค๋ฒ๋ณ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ํํ๋ก ๋ค๋ฅธ ์ํฅ์ ๋ผ์น์ง ์๋๋ก ํ ์ ์๋ค.
โณ use case์์ ์ฌ๋ฌ ๊ฐ์ repository๋ฅผ property๋ก ์ถ๊ฐ ๋๋ ๋ณ๊ฒฝํด์ ๋ก์ง์ ๊ตฌ์ฑํ ์ ์๊ณ , view model์์๋ ์ฌ๋ฌ ๊ฐ์ use case property๋ฅผ ์ฌ์ฉํ ์ ์๋ค. - ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP)
์ธํฐํ์ด์ค๋ ์ง๋์น๊ฒ ๊ด๋ฒ์ํ๊ฑฐ๋ ์ง๋์น๊ฒ ๋ง์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด ์ ๋๊ณ , ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค.
โณ clean architecture์์๋ ๊ฐ ๊ณ์ธต ๊ฐ์ ํต์ ์ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ค. ์ด ์ธํฐํ์ด์ค๋ ๊ฐ๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ๋ค๋ฅธ ๋ชฉ์ ์ ์ด์ฉ๋์ง ์๋๋ก ๊ตฌํํด์ผ ํ๋ค. - ์์กด์ฑ ์ญ์ ์์น(DIP)
๊ณ ์์ค ๋ชจ๋์ ์ ์์ค ๋ชจ๋์ ๊ตฌํ์ ์์กดํ๋ฉด ์ ๋๋ค. ๋์ ์ ์์ค ๋ชจ๋์ด ๊ณ ์์ค ๋ชจ๋์์ ์ ์ํ ์ถ์ ํ์ ์ ์์กดํ๋ค.
โณ clean architecture์์๋ ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด ํ์ ๋ชจ๋์ ๋ณ๊ฒฝ์ด ์์ ๋ชจ๋์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ์ค๊ณํด์ผ ํ๋ค.
์ถ๊ฐ์ ์ธ ์ ๋ณด๋ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ์.
clean architecture์ ๊ฐ ๊ณ์ธต์ ๊ตฌ์กฐ
clean architecture์ ๊ฐ ๊ณ์ธต์ data, domain, ui(presentation) layer๋ก ์ด๋ฃจ์ด์ง๋ค.
- data
์ฑ์์ ์ฒ๋ฆฌํ๋ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ณ ์ ์ฅ์ ํด๋์ค๋ก ๊ตฌ์ฑ๋๋ค.
๋ค๋ฅธ layer๋ data source์ ์ง์ ์ ๊ทผํด์๋ ์๋๋ค. data layer์ ์ง์ ์ ์ ํญ์ repository class ์ด์ด์ผ ํ๋ค.
repository์์ data source๋ฅผ ์ด์ฉํ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌ์ฑํ๋ค.
- repository
- data source
- doamin(์ ํ์ฌํญ)
๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ด๋ ์ฌ๋ฌ view model์์ ์ฌ์ฌ์ฉ๋๋ ๊ฐ๋จํ ๋น์ฆ๋์ค ๋ก์ง์ ์บก์ํํ๋ค.
๋ณต์ก์ฑ์ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ฌ์ฌ์ฉ์ฑ์ ์ ํธํ๋ ๋ฑ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ layer.
use case์์ data layer์ repository๋ฅผ ๋ถ๋ฌ์ ์บก์ํํ๋ค.
- use case
- ui(presentation)
ํ๋ฉด์ application ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ณ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์งํํ๋ค.
์ฌ์ฉ์ ์ํธ์์ฉ ๋๋ ๋คํธ์ํฌ ์๋ต ๋ฑ์ผ๋ก ์ธํด ๋ฐ์ดํฐ๊ฐ ๋ณํ ๋๋ง๋ค ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ํ๋๋ก UI๊ฐ ์ ๋ฐ์ดํธ๋์ด์ผ ํ๋ค.
ui state๋ฅผ ์ ์ํ๊ณ view model์์ ui state๋ฅผ ์ด์ฉํด ui element์ state ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค.
- ui elements
- view model
- ui state
์ํคํ ์ฒ ๊ตฌ์ฑ์ ๋ํ ๋ ์์ธํ ์ ๋ณด๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ .
https://developer.android.com/topic/architecture?hl=ko
clean architecture์ hilt
์ด clean architecture๋ฅผ ๊ตฌํํ ๋ ํญ์ ๋ฐ๋ผ๋ค๋๋ ๊ฒ์ด ์์กด์ฑ ์ฃผ์ ์ด๋ค.
๊ทธ์ค hilt๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ค.
์ clean architecture๋ฅผ ๊ตฌํํ ๋, hilt๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ๊น?
hilt๋ ์๋์ ๊ฐ์ ์ฅ์ ์ด ์๋ค.
- ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋ ๊ฐ์
hilt๋ ์์กด์ฑ ์ฃผ์ ์ฝ๋ ๋๋ถ๋ถ์ ์์ฑํด ์ค์ Dagger์ ๋นํด ์์ฑํด์ผ ํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋์ ์์ ์ค์ฌ์ค๋ค. - ์๋๋ก์ด๋ ์ปดํฌ๋ํธ์ ํตํฉ
activity, fragment, view model ๋ฑ ์๋๋ก์ด๋ ์ปดํฌ๋ํธ์ ์ํํ๊ฒ ํตํฉ๋์ด ์ด๋ฌํ ํด๋์ค์ ์์กด์ฑ์ ์ฝ๊ฒ ์ฃผ์ ํ ์ ์๋ค. @AndroidEntryPoint์ @HiltViewModel์ด ์๋ค. - ๋ชจ๋์ ์ํคํ
์ฒ ์ง์
hilt๋ milit module project ํ๊ฒฝ์์๋ ์ ์๋ํ๋ค. ์ด๋ก ์ธํด ์์กด์ฑ์ ์ ์ํ๊ณ ํ์ํ ๊ณณ์ ์ฃผ์ ํ ์ ์๋ค.
์ด์ hilt๊ฐ ์์ ์ฅ์ ๋ค์ด ์์ด์ clean architecture์์ ์์กด์ฑ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์จ ์ฐ์ด๋ ๊ฒ์ ์๊ฒ ๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ๋ ๊ถ๊ธํด์ง๋ค.
clean architecture๋ฅผ ๊ตฌํํ ๋, ๊ผญ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ๊ฑด๊ฐ?
๊ณต์ ๋ฌธ์์์๋ ์์กด์ฑ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ clean architecture๋ฅผ ๊ตฌํํ sample์ ์ ๊ณตํ๊ณ ์๋ค.
์์กด์ฑ ์ฃผ์ ์ด clean architecture์ ํ์์ ์ผ๋ก ์งํํด์ผ ํ๋ ์์ ์ด ์๋ ๊ฑด ์๊ฒ ๋๋ฐ ๊ทธ๋ฌ๋ฉด ์ ํด๋ ๋๋ ๊ฑฐ ์๋๊ฐ?
์ ๊ฐ์ ์๊ฐ์ด ๋ค์ด์ ์๋ฃ๋ฅผ ๋ ์ฐพ์๋ณด๊ฒ ๋์๋ค.
๊ผญ ์์กด์ฑ ์ฃผ์ ์ ํด์ผ ํ๋ ๊ฑธ๊น?
์๋ฌด๋ฆฌ ์ฐพ์๋ด๋ ์๋ฃ๋ค์ด ๋์ค์ง ์์์ AI(perplexity) ๊ธฐ๋ฐ ๋ํผ์ ์ ์ ๋ฆฌํด ๋ณด๊ฒ ๋ค.
clean architecture์ ์ฅ์ ์ผ๋ก ๋๋ถ๋ถ์ด ์ด๋ ๊ฒ ์ธ๊ธํ๋ค.
- ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
- ํ ์คํธ ์ฉ์ด์ฑ
clean architecture์์์ ํต์ฌ์ ์์กด์ฑ ๊ท์น์ด๋ค. ์์กด์ฑ ๊ท์น์ ๋ฐ๋ฅด๋ฉด ๋ด๋ถ layer๋ ์ธ๋ถ layer์ ์์กดํ๋ฉด ์ ๋๋ค.
์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ด ๊ท์น์ ๋ฐ๋ฅผ ์๋ ์์ง๋ง, ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ด ๊ท์น์ ๋ ์ฝ๊ฒ ์ค์ํ ์ ์๋ค.
์์กด์ฑ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ hilt๋ฅผ ์ฌ์ฉํ๋ฉด ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๋ ๊ฐํธํด์ง๊ณ ์๋์ผ๋ก ์์กด์ฑ์ ์ฃผ์ ํ ์๋ ์๋ค.
์ ๋ฆฌ
์ด๋ฒ์ ๋ค์ํ clean architecture์ ๋ํ ์๋ฃ๋ค์ ์ฐพ์๋ณด๋ฉด์ clean architecture์๋ solid ์์น, ์์กด์ฑ ์ฃผ์ ๊ณผ hilt ๋ฑ ๋ค์ํ ๊ฐ๋ ๋ค์ด ์ฐ๊ด๋์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๋ค์ํ ๊ฐ๋ ์ ์ฐพ์๋ณด๋ฉด์ ๊ณต๋ถํ๋ ๊ณ๊ธฐ๊ฐ ๋์๋ค.
๊ถ๊ธํ๋ ๊ฒ๋ค์ ์๋ฃ๋ค์ด ๋ง์ง ์์์ AI(perplexity) ๊ธฐ๋ฐ์ ๋ํผ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ ์ ์ํด ๋ถํํ๋ค.
ํน์ ๋๋ฝ๋ ์ ๊ณผ ์ถ๊ฐํ ๊ฐ๋ ์ด ์๋ค๋ฉด ์ ๋ณดํด ์ฃผ๋ฉด ๊ณ ๋ง๊ฒ ๋ค.
๋ค์์๋ clean architecture์ ํจ๊ป ์ค ํ์์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋์์ธ ํจํด์ธ mvvm์ ๋ํ ๊ณ ์ฐฐ์ ์งํํด ๋ณด๊ฒ ๋ค.
์ฌ์ค ๋ง๋ง ๊ณ ์ฐฐ์ด์ง ๊ทธ๋ฅ ๋ด๊ฐ ๊ถ๊ธํ๋ ๋ด์ฉ๋ค์ ์ ๋ฆฌํ๋ ํฌ์คํ ์ด๋ค.