1. Null 안전성 문제
LiveData.value와 StateFlow.value는 nullable을 반환
- 초기화 전이나 데이터 로딩 중에는
null일 수 있음
- 매번 null 체크가 필요하고 혹시
!! 를 사용한다면 크래시 가능성이 있음
2. 생명주기 무시
.value 직접 접근은 Fragment의 생명주기와 무관하게 동작
- Fragment가
STOPPED 상태에서도 값을 읽어 UI 업데이트 시도 가능
onDestroyView() 이후 접근 시 View가 없어 크래시
3. 반응성이 없어진다
// 해당 시점의 값만 가져옴 - 이후 변경 감지 불가
val data = viewModel.data.value
// observe 패턴을 사용한다면 변경에 반응
viewModel.data.observe(viewLifecycleOwner) { data ->
// 자동으로 업데이트됨
}
4. Race Condition / 타이밍 문제
- 비동기 데이터 로딩 완료 전에
.value 접근 → null 또는 stale data
- Configuration change 시 타이밍에 따라 다른 값 반환
올바른 패턴
LiveData
viewModel.data.observe(viewLifecycleOwner) { value ->
// 생명주기 안전 + 자동 구독 해제
updateUI(value)
}
StateFlow (with repeatOnLifecycle)
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect { state ->
updateUI(state)
}
}
}