2026/05/03

오늘의 이야기

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


📊 피드백 그래프



























 





댓글 없음:

댓글 쓰기

오늘의 이야기

AI 생성 이미지   1️⃣ 글 제목 - 🐍 Python | Raspberry Pi에서 오픈소스 LLM으로 뉴스 요약기 만들기 --- 2️⃣ 개요 (Intro) - 오늘은 라즈베리 파이에서 오픈소...