| Layer | ๋ํ ๋ชจ๋ | ํต์ฌ ์ฑ ์ | ์์ ๊ณ์ธต ๋ ธ์ถ ๋ฐฉ์ |
|---|---|---|---|
| Domain | domain |
๋น์ฆ๋์ค ๋ชจ๋ธ, Repository ์ธํฐํ์ด์ค, Scheduler ๊ณ์ฝ | Kotlin interface + data class (์์กด์ฑ ์ญ์ ) |
| Data | data |
FortuneRepositoryImpl, AlarmRepositoryImpl ๋ฑ ์ธ๋ถ ์์ค ์ฐ๋ |
Domain ์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ Hilt๋ก ๋ฐ์ธ๋ฉ |
| UI/Feature | feature:*, app |
Compose ํ๋ฉด, Orbit Container ๊ธฐ๋ฐ ViewModel, ๋ด๋น๊ฒ์ด์ | Domain ์ธํฐํ์ด์ค ์ฃผ์ , core ์ ํธ ์ฌ์ฉ |
| Core | core:* |
๋คํธ์ํฌ, ๋์์ธ ์์คํ , ์๋, ๋ฏธ๋์ด ๋ฑ ์ธํ๋ผ์ฑ ๋ก์ง | ํ์ํ ๋ชจ๋์ implementation์ผ๋ก ์์กด |
๋๋ฉ์ธ ๊ณ์ฝ(domain/src/main/java/com/yapp/domain/repository/FortuneRepository.kt)์ ์ด๋ ํ ํ๋ ์์ํฌ์๋ ์์กดํ์ง ์์ต๋๋ค.
interface FortuneRepository {
val fortuneCreateStatusFlow: Flow<FortuneCreateStatus>
suspend fun getFortune(fortuneId: Long): Result<Fortune>
suspend fun markFortuneSeen()
// ...
}UI ๊ณ์ธต์์๋ ๊ตฌํ์ฒด๊ฐ ์๋ ์ธํฐํ์ด์ค๋ง ์ฃผ์
ํฉ๋๋ค. ์์๋ feature/mission/src/main/java/com/yapp/mission/MissionViewModel.kt์
๋๋ค.
@HiltViewModel
class MissionViewModel @Inject constructor(
private val fortuneRepository: FortuneRepository,
// ์๋ต
) : ViewModel(), ContainerHost<MissionContract.State, MissionContract.SideEffect> {
private fun completeMission(type: String) = intent {
val status = fortuneRepository.fortuneCreateStatusFlow.first()
// ์ํ ๊ณ์ฐ & ์ฌ์ด๋์ดํํธ ์ ํ
}
}FortuneRepositoryImpl(data ๋ชจ๋)์ Retrofit/Room/Datastore๋ฅผ ์กฐํฉํด ์ธํฐํ์ด์ค๋ฅผ ๋ง์กฑ์ํค๊ณ , app ๋ชจ๋์ Hilt module์์ ๋ฐ์ธ๋ฉํฉ๋๋ค. ์ด ํ๋ฆ ๋๋ถ์ API ์คํ์ด ๋ฐ๋์ด๋ UI ๋ชจ๋์ ์ธํฐํ์ด์ค ๊ทธ๋๋ก ์ ์ง๋๋ฉฐ, ํ
์คํธ์์๋ Fake/Stub Repository๋ง ์ฃผ์
ํ๋ฉด ๋ฉ๋๋ค.
์๋๋ก์ด๋์์ ํํ MVVM๊ณผ MVI์ ์ฐจ์ด๋ฅผ ์๋ฐฉํฅ vs. ๋จ๋ฐฉํฅ, ์ฌ๋ฌ ์ํ vs. ๋จ์ผ ์ํ๋ก ์ค๋ช
ํ์ง๋ง ์ค์ ๋ก๋ ์ด ๊ตฌ๋ถ์ด ์ ํํ์ง ์์ต๋๋ค.
๊ณต์ ๋ฌธ์์ ์ํคํ
์ฒ ๋ค์ด์ด๊ทธ๋จ์ ๋ณด๋ฉด MVVM ์ญ์ ์ฌ์ฉ์ ์ด๋ฒคํธ โ ViewModel โ Data Layer โ State โ View ์ ๋จ๋ฐฉํฅ(UDF) ํ๋ฆ์ ์ ์งํฉ๋๋ค.
๋ํ ๋จ์ผ ์ํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ MVI๋ง์ ํน์ง์ด ์๋๋ผ MVVM์์๋ ์ถฉ๋ถํ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
์ ๊ฐ ์๊ฐํ๋ ๋ ํจํด์ ๋ณธ์ง์ ์ธ ์ฐจ์ด๋ โ์ํ ๋ณ๊ฒฝ์ ์ด๋ป๊ฒ ๋ฐ์์ํค๋๊ฐโ, ์ฆ View์ ViewModel์ ๊ฒฐํฉ๋์ ๋๋ค.
- MVVM: View๊ฐ ViewModel์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค. ์ด๋ก ์ธํด View๋ ViewModel์ API์ ์์กดํ๊ณ , ์ํ ๋ณ๊ฒฝ ๋ก์ง์ด ์ฌ๋ฌ ๋ฉ์๋์ ํฉ์ด์ง ์ ์์ต๋๋ค. ์ํ๊ฐ ์ฌ๋ฌ ์์ค์ ๋ถ์ฐ๋๋ฉด ํ ์คํธ ์ ๊ฐ๋ณ ํ๋ฆ์ ๋ฐ๋ก ๊ฒ์ฆํด์ผ ํ๊ณ UI๊ฐ ์ผ์์ ์ผ๋ก ๋ถ์์ ํ ์ค๋ ์ท์ ๋ณด์ฌ์ค ๊ฐ๋ฅ์ฑ๋ ์์ต๋๋ค.
- MVI: View๋ Intent(์ฌ์ฉ์์ ์๋)๋ง ๋ฐํํ๊ณ , ์ํ ๋ณ๊ฒฝ์ ViewModel ๋ด๋ถ์ Reducer์์ ๋จ์ผ ๊ฒฝ๋ก๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ชจ๋ ์ํ ๋ณํ ํ๋ฆ์ด ํ์คํ๋๊ณ ์์ฐจ์ ์ด๊ธฐ ๋๋ฌธ์ UI ์ผ๊ด์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ด ๋์์ง๋๋ค.
Orbit-MVI๋ ์ด๋ฌํ MVI ์ฒ ํ์ ์ ์งํ๋ฉด์๋ ViewModel ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ์์ฐ์ฑ์ ์ ์งํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅด๋น ํ๋ก์ ํธ์์ ์ฑํํ์ต๋๋ค.
| ํญ๋ชฉ | MVVM(UDF) ํด์ | Orbit-MVI ์ ์ฉ |
|---|---|---|
| ๋ฐ์ดํฐ ํ๋ฆ | View โ ViewModel ๋ฉ์๋ โ Flow/State โ View. Compose์ collectAsState()๋ก ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ ์ ์ง ๊ฐ๋ฅ. |
View โ processAction() โ Intent โ Reducer โ State/SideEffect. Orbit DSL์ด ์์ฐจ ์ฒ๋ฆฌ์ ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅ. |
| ์ํ ๊ด๋ฆฌ | ์ฌ๋ฌ StateFlow/mutableStateOf๋ฅผ ๋ณ๋๋ก ๊ด๋ฆฌํ๋ฉด ์ํ ์กฐ๊ฐ์ด ํฉ์ด์ง ์ ์์. |
ํ๋ฉด ์ํ๋ฅผ ๋จ์ผ Contract.State ๊ฐ์ฒด๋ก ํํ (MissionContract.State, FortuneContract.State ๋ฑ). |
| ์์กด ๊ด๊ณ | View๊ฐ ViewModel์ public ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถ โ ๊ฒฐํฉ๋ ์ฆ๊ฐ. | View๋ Intent(Action)๋ง ์ ๋ฌ. ์ํ ๋ณ๊ฒฝ ๋ก์ง์ Reducer ๋ด๋ถ๋ก ์บก์ํ๋์ด ๊ฒฐํฉ๋ ๊ฐ์. |
| ํ ์คํธ | ์ฌ๋ฌ Flowยท์ํ ์์ค๋ฅผ ๊ฐ๊ฐ ๊ฒ์ฆํด์ผ ํจ. | Intent ํธ์ถ โ ๋จ์ผ State snapshot๋ง ๊ฒ์ฆ. Orbit test ๋ชจ๋๋ก ์๋๋ฆฌ์ค ๊ธฐ๋ฐ ํ
์คํธ ์ฉ์ด. |
| ์ ์ฉ ๋ชจ๋ | core/ui ๋ด๋ถ ๊ณต์ฉ UI, Compose Preview ๋ฑ์์ ์์ฐ์ค๋ฝ๊ฒ MVVM ๊ธฐ๋ฐ. |
feature/mission, feature/fortune, feature/home, feature/onboarding ๋ฑ์์ Orbit-MVI ์ ์ฉ. |
์ด์ ์ ๋
ผํ๋ ์์ํฌ MVI๋ฅผ ๊ตฌํํ๋ ๊ฒฝํ์ด ์์ด ์์ฉ MVI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๊ตํ๋ฉฐ ์ฅ์ ์ ๋๋ ์ ์์์ต๋๋ค.
SavedStateHandle์ ์ง์ ์ฃผ์ ํ ์ ์์ โ ์ํ ๋ณต์ ์@PersistState์์กด- ViewModel ์์ฑ ์ AssistedInject + ViewModelModule ํ์ โ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฆ๊ฐ
-
DSL ๊ธฐ๋ฐ ์ ์ธ์ ์ํ ๊ด๋ฆฌ
intent {},reduce {},postSideEffect {}ํํ๋ก ๊ตฌ์กฐ๊ฐ ๋ช ํ- ์ํ ๋ณ๊ฒฝ ๊ฒฝ๋ก๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋จ์ผํ โ ๊ฐ๋ ์ฑ ์ฐ์
-
์๋ช ์ฃผ๊ธฐ ์์ ํ๋ก์ฐ ์ฒ๋ฆฌ
repeatOnSubscription์ผ๋ก ํ๋ฉด ๊ตฌ๋ ์์ ์๋ง Flow ์์ง- ์๋ช ์ฃผ๊ธฐ ์ง์ ์ ์ด ๋ถํ์
-
๋ด๋ถ DispatchQueue ๊ธฐ๋ฐ ์์ฐจ ์ฒ๋ฆฌ
- ๋ชจ๋ Intent๊ฐ ํ์ ์์ฌ ์ฐจ๋ก๋๋ก ์คํ
- ๊ฒฝ์ ์ํ๋ ์ค๊ฐ ์ค๋ ์ท ๋ฌธ์ ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ํด๊ฒฐ
- ๊ฐ๋ฐ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค ๊ฐ๋ฅ

