์ฌ์ฉ์์๊ฒ ์๋น์ค ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ๋ค์ด ๋ง๊ณ ๋ณต์กํ๋ค. ์ด๋ฐ ์ฑ์ ๊ฐ๋ฐ ํ ๋ ์ด๋ป๊ฒ ํด์ผ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ฉฐ ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ง์ ๊ณ ๋ฏผํ๋ฉฐ ๋์จ ๊ฐ๋ ์ด Clean Architecture ์ด๋ค.
View๋ ๊ธฐ์กด์ ๊ณต๋ถํ์๋ MVVMํจํด์ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋๊ฒ ๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ปค์ง์๋ก, ViewModel์ด ๋๋ฌด ์ปค์ง๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์ํฐํฐ๋ ๋น์ฆ๋์ค ๋ก์ง๋ค์ ์งํฉ์ด๋ผ ๋ณผ ์ ์๋ค.
Clean Architecture์์ ๊ฐ ๋ ์ด์ด์ ์์กด์ฑ์ ์์ชฝ์ผ๋ก๋ง ํฅํ๊ฒ ํด์ผํ๋ค. ์ฆ ๋ด๋ถ ์์ ์๋ ๊ฒ์ด ์ ์ฑ ์ด๋ฉฐ ๋ฐ๊นฅ์ผ๋ก ๊ฐ ์๋ก ๊ทธ ์ ์ฑ ์ ์คํํ๋๋ก ํด์ผ ํ๋ค.
Use Case๋ ์ํํธ์จ์ด ๊ณตํ์์์ ์ ์ค์ผ์ด์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฌ์ฉ์(Actor)๊ฐ ํ๋ ํ๋๋ค์ ๋งํ๋ค.
Domain Layer : Android์์ UseCase๋ ๋๋ฉ์ธ ๋ ์ด์ด์ ์ํ๋ค. ๋๋ฉ์ธ ๋ ์ด์ด๋ Android ํ๋ ์์ํฌ์ ์์กด์ ์ด์ง ์์ ์์ Kotlin ์ฝ๋๋ฅผ ๋งํ๋ค. ์ฌ๊ธฐ์๋ UseCase, Entity(Model/ Room, Retrofit๊ณผ ์ฐ๊ฒฐ ๋์ง ์์ ์์ data class), Repository(ํ ํ๋๋ค ๋ด๊ณ ์์, interface ํํ)๊ฐ ํฌํจ๋๋ค. Use Case๋ฅผ ์ฐธ๊ณ ํ์ฌ Data Layer์์ Repository๋ฅผ ๊ตฌํ ํ ์ ์๋๋ก Repository ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
Data Layer : ๋๋ฉ์ธ ๋ ์ด์ด์์ ๋ง๋ repository๋ฅผ ์ค์ ๋ก ๊ตฌํํ๋ฉฐ(ResositoryImpl ํด๋์ค ์์ฑ) ๋๋ฉ์ธ ๋ ์ด์ด๋ฅผ ์ฐธ์กฐ ๊ฐ๋ฅํ๋ฉฐ ์๋๋ก์ด๋์ ๊ด๋ จ๋ ๋คํธ์ํฌ ํต์ ์ ๊ตฌํํ๋ ๊ณณ์ด๋ค. Mapper๋ฅผ ํตํด DB๋ก๋ถํฐ ๋ฐ์์จ ๋ฐ์ดํฐ ๋ชจ๋ธ์ UI์ ๋ง๋ ๋ชจ๋ธ๋ก ๋งคํํ๋ค. Repository์์ ์ฌ์ฉํ๋ DTO๋ฅผ ์ ์ธํ๋ ๊ณณ์ด๋ค.
Presentation Layer : Clean Architecture์์ ์ต์๋จ ๋ ์ด์ด์ด๋ฉฐ Android ํ๋ ์์ํฌ์ ๋งค์ฐ ์ฐ๊ด๋์ด ์๋ค. ๋ํ ์๋ ๋ ์ด์ด๋ค์ ์์ ๋กญ๊ฒ ์ฐธ์กฐ ๊ฐ๋ฅํ๋ค. MVVM ๋์์ธ ํจํด์ด ์ฌ๊ธฐ์ ์ ์ฉ๋๋ค.
UseCase๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ViewModel์ด ์ด๋ค๊ฒ์ ํ๊ณ ์ ํ๋์ง ์ง๊ด์ ์ผ๋ก ํ์ ํ ์ ์๊ณ ViewModel์ ์์กด์ฑ์ ์ค์ผ ์ ์๋ค. Repository๋ฅผ parameter๋ก ๋ฃ์ผ๋ฉด repository ๋ด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ฒ ๋๋ ๊ฒฝ์ฐ ๋ชจ๋ viewmodel์ ๋ณ๊ฒฝํด์ผ ํ์ง๋ง usecase๋ฅผ ์ฌ์ฉํ๋ฉด viewmodel์ ์ํฅ์ ์ ํ ์ฃผ์ง ์๊ณ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค!!
ViewModel์ ์์กด๋๋ฅผ ์ค์ด๊ธฐ!!