반응형

🧠 Android | ViewModel에서 StateFlow로 상태 관리하기
개요 (Intro)
오늘은 기존에 사용하던 LiveData 대신 StateFlow를 이용해 UI 상태를 더 명확하고 안정적으로 관리하는 방법을 실험해봤습니다.
📅 날짜: 2025.10.30
🎯 목표: ViewModel에서 StateFlow로 UI 상태 관리하기
🧰 기술: Kotlin, Jetpack Compose, Hilt, StateFlow, ViewModel
문제 정의 (Problem / Motivation)
앱에서 LiveData를 사용할 때, 다음과 같은 문제가 있었습니다:
- 화면 회전 시 상태가 재구성되지 않거나 중복 업데이트 발생
- MutableLiveData의 비동기 처리 시점 불일치
- Compose 환경에서 Flow 변환을 반복적으로 수행해야 하는 번거로움
이 문제를 해결하기 위해 StateFlow 기반의 단방향 데이터 스트림 (Unidirectional Flow) 패턴을 적용해보기로 했습니다.
@HiltViewModel
class MainViewModel @Inject constructor() : ViewModel() {
private val _uiState = MutableStateFlow("초기 상태")
val uiState: StateFlow<String> = _uiState.asStateFlow()
fun updateMessage(newMessage: String) {
_uiState.value = newMessage
}
}
@Composable
fun MainScreen(viewModel: MainViewModel = hiltViewModel()) {
val message by viewModel.uiState.collectAsState()
Column(
modifier = Modifier.fillMaxSize().padding(16.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = message)
Spacer(modifier = Modifier.height(12.dp))
Button(onClick = { viewModel.updateMessage("StateFlow 업데이트 완료!") }) {
Text("업데이트")
}
}
}
결과 (Result)
✅ ViewModel의 상태가 Compose UI와 실시간으로 안정적으로 동기화됨
🚀 화면 회전, 재구성 시에도 데이터 손실 없이 유지
📱 코드 간결성 증가 및 비동기 처리 예측 가능성 향상
느낀 점 / 회고 (Reflection)
- LiveData보다 StateFlow가 Compose 환경과 훨씬 궁합이 좋음을 체감했습니다.
- Flow 기반 전환으로 테스트 코드 작성 및 재구성 관리가 간편해졌습니다.
- 앞으로는 모든 ViewModel 상태 관리를 StateFlow + UIState sealed class 형태로 전환할 예정입니다.
참고자료 (References)
✅ 요약하자면?
StateFlow는 LiveData보다 예측 가능하고 Compose 친화적입니다.
UI 상태 동기화 문제를 간단히 해결할 수 있으며, 구조적 안정성이 향상됩니다.
다음 단계로는 sealed class UIState 패턴과 결합해볼 예정입니다.
📊 피드백 그래프
| 항목 | 만족도 | 설명 |
|---|---|---|
| 코드 안정성 | ⭐⭐⭐⭐⭐ | 예측 가능하고 단방향 흐름 유지 |
| Compose 호환성 | ⭐⭐⭐⭐⭐ | collectAsState()로 자연스럽게 연동 |
| 개발 효율성 | ⭐⭐⭐⭐☆ | 코드 단순화 및 유지보수성 향상 |
반응형
'모바일 앱(안드로이드)' 카테고리의 다른 글
| 개발일기: Wear OS Tile Chip 너비 문제 해결 (1) | 2025.11.11 |
|---|---|
| 습관관리 앱 : 개발 일기, 인앱 업데이트, 코드 최적화, 그리고 험난했던 Gradle 플러그인 설정기 (1) | 2025.10.24 |
| 습관 관리 앱: 개발 일기, 광고 페이지 성능 개선 및 UI 리팩토링 (1) | 2025.10.22 |
| 습관관리 앱 : Jetpack Compose 광고 페이지 개발 및 성능 개선기 (1) | 2025.10.20 |
| 습관관리 앱 구현 과정 : Jetpack Compose에서 TopAppBar 구현 과정, 동적 버전 표시 및 웹 연동 (2) | 2025.10.18 |