Today's

길을 나서지 않으면 그 길에서 만날 수 있는 사람을 만날 수 없다

모바일 앱(안드로이드)

🧠 Android | ViewModel에서 StateFlow로 상태 관리하기

Billcorea 2025. 10. 30. 15:58
반응형

viewmodel

 

🧠 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 패턴과 결합해볼 예정입니다.

📊 피드백 그래프

 

반응형