https://github.com/sagehabitus/pagingcomposemviapp
https://github.com/sagehabitus/pagingcomposemviapp
coroutine flow kotlin mvi-clean-architecture mvi-coroutines-flow-kotlin paging3 room-database stateflow-android viewmodel
Last synced: 11 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/sagehabitus/pagingcomposemviapp
- Owner: SageHabitus
- Created: 2024-09-02T04:53:44.000Z (almost 2 years ago)
- Default Branch: master
- Last Pushed: 2024-09-16T01:57:09.000Z (almost 2 years ago)
- Last Synced: 2025-03-03T12:33:17.028Z (over 1 year ago)
- Topics: coroutine, flow, kotlin, mvi-clean-architecture, mvi-coroutines-flow-kotlin, paging3, room-database, stateflow-android, viewmodel
- Language: Kotlin
- Homepage:
- Size: 266 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
### ๐ ์ฑ
๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์
(Jetpack Compose with Advanced MVI Concepts)
๋ณธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๊ฐ ๋ง์ง๋ง ์๋ํ ๊ฒ์์ ์๋ ค๋๋ฆฝ๋๋ค. **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
## MVI ์ํคํ
์ฒ์ ์ฅ์ ๋ฐ MVVM์ ํ๊ณ ๐
### MVVM์ ํ๊ณ
**MVVM (Model-View-ViewModel)** ์ํคํ
์ฒ๋ Android ๊ฐ๋ฐ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํจํด์ด์ง๋ง, ๋ช ๊ฐ์ง ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค:
- **์ํ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ**: ViewModel์ด ๋๋ฌด ๋ง์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด์ ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
- **UI์ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐํ ๊ฒฐํฉ**: View์ ViewModel ๊ฐ์ ์ํธ์์ฉ์ด ๋ณต์กํด์ง๋ฉด, ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
- **๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ์ ์ด๋ ค์**: ํนํ ๋น๋๊ธฐ ์์
์ ๋ค๋ฃฐ ๋, ์ํ ์ ์ด๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
### MVI์ ์ฅ์
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 ์ํ์ ์ฌ์ฉ์ ์ด๋ฒคํธ ๊ฐ์ ์ํธ์์ฉ์ ๊ด๋ฆฌํฉ๋๋ค.
## CI ๋ฐ ํ
์คํธ ๐งช
- **GitHub Actions**: PR ์์ฑ ์ ์๋ ๋น๋ ๋ฐ ํ
์คํธ๋ฅผ ์ํํ์ฌ ์ฝ๋ ํ์ง์ ์ ์งํฉ๋๋ค.
- **Compose UI Test**: Jetpack Compose๋ก ์์ฑ๋ UI์ ํ
์คํธ๋ฅผ ์ง์ํฉ๋๋ค.
- **JUnit ๋ฐ Espresso**: ๋น์ฆ๋์ค ๋ก์ง ๋ฐ UI ํ
์คํธ๋ฅผ ์ํ ํ๋ ์์ํฌ๋ก, ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฒ์ฆํฉ๋๋ค.