๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๊ฐ ๋ง์ง๋ง ์๋ํ ๊ฒ์์ ์๋ ค๋๋ฆฝ๋๋ค. Paging 3์ Room, Retrofit ๋ฑ์ ์ต์ ์๋๋ก์ด๋ ๊ธฐ์ ์คํ์ ํ์ฉํ์ฌ ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์คํ๋ผ์ธ ์ ์ฅ์๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ด๊ณ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์ค๊ณ๋์๊ณ ์ต๋ํ ๊ตฌ๊ธ์ํคํ ์ณ๋ฅผ ์ ์ฉํ๊ธฐ ์ํด ๋ ธ๋ ฅํ์ต๋๋ค.
DataSource, UseCase ์๋ต๊ฐ๋ฅ, DomainModel, PresentationModel ์๋ต ๊ฐ๋ฅ, UiState ๋ณํฉ ๊ฐ๋ฅ
-
์ค์๊ฐ API ํต์ ๐: ์นด์นด์คํก API ๋๋ ๋ค์ด๋ฒ API๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ผ ์ค์๊ฐ์ผ๋ก ์ฑ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค. Retrofit๊ณผ OkHttp๋ฅผ ํตํด ์์ ์ ์ธ ๋คํธ์ํฌ ํต์ ์ ๋ณด์ฅํฉ๋๋ค.
-
MVI ์ํคํ ์ฒ ๐ง : MVI ํจํด์ ํตํด ๋ชจ๋ ์ฌ์ฉ์ ์ด๋ฒคํธ(Intent)๋ฅผ ์ค์์์ ์ฒ๋ฆฌํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI ์ํ(State)๊ฐ ๋ณ๊ฒฝ๋์ด UI์ ๋ฐ์๋ฉ๋๋ค. MVI์ ํต์ฌ ๊ตฌ์ฑ ์์์ธ PartialStateChange, Intent, Event, State๋ ์ํ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ , ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋ช ํํ ํ๋ฆ์ ์ ์งํฉ๋๋ค.
-
๋ก์ปฌ ๋ฐ์ดํฐ ์บ์ฑ ๐ : Room์ ์ฌ์ฉํ์ฌ ๊ฒ์๋ ์ฑ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํฉ๋๋ค. ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋๊ฒจ๋ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ์งํ ์ ์์ต๋๋ค.
-
ํจ์จ์ ์ธ ํ์ด์ง ์ฒ๋ฆฌ ๐: Paging 3 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ด์ง ๋จ์๋ก ๋ก๋ํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค. Jetpack Compose์ ํตํฉ๋์ด ๋ฌดํ ์คํฌ๋กค, ๋ฐ์ดํฐ ๊ฐฑ์ ๋ฑ์ ๊ธฐ๋ฅ์ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
-
Jetpack Compose UI ๐ฑ: ์ ์ธ์ UI ํ๋ ์์ํฌ์ธ Jetpack Compose๋ฅผ ์ฌ์ฉํ์ฌ Android UI๋ฅผ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , UI ์ ๋ฐ์ดํธ์ ๋ณต์ก์ฑ์ ์ค์ ๋๋ค.
-
CI ์๋ํ ๐: GitHub Actions๋ฅผ ํ์ฉํด Pull Request ์ ์๋ ๋น๋ ๋ฐ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
- ์ธ์ด: Kotlin
- UI: Jetpack Compose
- ๋คํธ์ํฌ ํต์ : Retrofit, OkHttp, Corouitne, Flow
- ๋น๋๊ธฐ ์์ : Corouitne, Flow, StateFlow, SharedFlow
- JSON ํ์ฑ: Kotlin Serialization, Parcelable
- ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค: Room
- ์ด๋ฏธ์ง ๋ก๋ฉ: Coil
- ์์กด์ฑ ์ฃผ์ : Hilt
- ํ์ด์ง ์ฒ๋ฆฌ: Paging 3 (+RemoteMediator)
- ํ ์คํธ: JUnit, Espresso, Mokito, Compose UI Test
- CI: GitHub Actions
MVVM (Model-View-ViewModel) ์ํคํ ์ฒ๋ Android ๊ฐ๋ฐ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํจํด์ด์ง๋ง, ๋ช ๊ฐ์ง ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค:
- ์ํ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ: ViewModel์ด ๋๋ฌด ๋ง์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด์ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
- UI์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐํ ๊ฒฐํฉ: View์ ViewModel ๊ฐ์ ์ํธ์์ฉ์ด ๋ณต์กํด์ง๋ฉด, ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ด๋ ค์: ํนํ ๋น๋๊ธฐ ์์ ์ ๋ค๋ฃฐ ๋, ์ํ ์ ์ด๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
MVI๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค:
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ: ์ํ ๋ณํ๊ฐ ๋ช ํํ๊ฒ Intent โ State โ UI๋ก ํ๋ฅด๋ฏ๋ก ๋๋ฒ๊น ์ด ์ฉ์ดํฉ๋๋ค.
- ์์ธก ๊ฐ๋ฅํ ์ํ ๊ด๋ฆฌ: ๋ชจ๋ ์ํ ๋ณ๊ฒฝ์ด ๋ช ์์ ์ธ Intent์ ์ํด ์ด๋ฃจ์ด์ง๋ฉฐ, ์ค๊ฐ ์ํ(PartialStateChange)๋ฅผ ํตํด ์ํ ๋ณํ์ ์ธ๋ถ ์ฌํญ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
- ๊ณ ๋ฆฝ๋ ๋น์ฆ๋์ค ๋ก์ง: ์ํ ๊ด๋ฆฌ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ถ๋ฆฌ๋๋ฏ๋ก ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ํ ์คํธ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
- ์๋ ๊ธฐ๋ฐ ์ํธ์์ฉ: ์ฌ์ฉ์์ ์ก์ (Intent)์ ๊ธฐ๋ฐํ์ฌ UI๋ฅผ ๊ฐฑ์ ํ๋ฏ๋ก, UI์ ๋น์ฆ๋์ค ๋ก์ง์ ์๋๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
์ด ํ๋ก์ ํธ๋ Google Architecture ์์น์ ์ค์ํ๋ฉฐ, core
, data
, domain
, presentation
์ ๋ค ๊ฐ์ง ๋ชจ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
-
core: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ค์ ๋ฐ ์ด๊ธฐํ๋ฅผ ๋ด๋นํฉ๋๋ค.
ComposeMVIApplication.kt
ํ์ผ์ Hilt๋ฅผ ์ฌ์ฉํ ์์กด์ฑ ์ฃผ์ ์ ์ค์ ํฉ๋๋ค. -
data: ๋ฐ์ดํฐ ๋ ์ด์ด๋ก, API ํธ์ถ, ๋ก์ปฌ DB ๊ด๋ฆฌ, ๋ฐ์ดํฐ ๋งคํ ๋ฐ ํ์ด์ง ์ฒ๋ฆฌ์ ๊ด๋ จ๋ ๋ชจ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค. Repository ํจํด์ ์ฌ์ฉํ์ฌ Domain ๋ ์ด์ด์ ํต์ ํฉ๋๋ค.
-
domain: ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ๋ฉฐ, Use Case๋ฅผ ํตํด Presentation ๋ ์ด์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๋ณต์ก์ฑ์ ์จ๊ธฐ๊ณ , ๋จ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
presentation: UI๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, Jetpack Compose๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ๊ตฌ์ฑํฉ๋๋ค. MVI ํจํด์ ๊ตฌํํ์ฌ UI ์ํ์ ์ฌ์ฉ์ ์ด๋ฒคํธ ๊ฐ์ ์ํธ์์ฉ์ ๊ด๋ฆฌํฉ๋๋ค.
- GitHub Actions: PR ์์ฑ ์ ์๋ ๋น๋ ๋ฐ ํ ์คํธ๋ฅผ ์ํํ์ฌ ์ฝ๋ ํ์ง์ ์ ์งํฉ๋๋ค.
- Compose UI Test: Jetpack Compose๋ก ์์ฑ๋ UI์ ํ ์คํธ๋ฅผ ์ง์ํฉ๋๋ค.
- JUnit ๋ฐ Espresso: ๋น์ฆ๋์ค ๋ก์ง ๋ฐ UI ํ ์คํธ๋ฅผ ์ํ ํ๋ ์์ํฌ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฒ์ฆํฉ๋๋ค.