코틀린 & 컴포즈 & Java/컴포즈 Compose

[Compose] LiveData vs StateFlow: Compose에서 어떤 것을 사용할까?

코딩하는후운 2025. 2. 6. 17:46
반응형

1. LiveData를 Compose에서 사용하는 방법

LiveData는 Android의 UI 상태를 관리하는 기존 방식입니다.
Compose에서는 observeAsState()를 사용하여 LiveDataCompose 상태(State<T?>)로 변환할 수 있습니다.

@Composable
fun LiveDataExample(viewModel: MyViewModel) {
    val liveDataValue: String? by viewModel.myLiveData.observeAsState()

    Text(text = liveDataValue ?: "No data available")
}

📌 observeAsState()란?

 LiveData<T> State<T?>로 변환합니다.
✔ LiveData의 값이 변경될 때마다 자동으로 UI를 재구성합니다.
✔ LiveData가 null일 수 있으므로 State<T?> 형태로 변환됩니다.

📌 LiveData의 단점:

  • 초기값이 없을 수 있어 null 처리를 해야 함.
  • Kotlin Coroutine과의 연동이 불편함.
  • 비동기 처리 및 백프레셔(Backpressure) 처리가 어려움.

 

 

2. StateFlow를 Compose에서 사용하는 방법

StateFlow Flow 기반의 상태 관리를 위한 최적화된 방식입니다.
Compose에서는 collectAsState()를 사용하여 StateFlow를 Compose 상태로 변환할 수 있습니다.

class MyViewModel : ViewModel() {
    private val _stateFlow = MutableStateFlow("Initial Value")
    val stateFlow: StateFlow<String> = _stateFlow

    fun updateData(newData: String) {
        _stateFlow.value = newData
    }
}

@Composable
fun StateFlowExample(viewModel: MyViewModel = viewModel()) {
    val stateValue by viewModel.stateFlow.collectAsState() // StateFlow를 State로 변환

    Column {
        Text(text = stateValue)
        Button(onClick = { viewModel.updateData("Updated Value") }) {
            Text("Update Data")
        }
    }
}

📌 StateFlow의 장점: ✔ 항상 초기값이 존재함 (null-safe)
✔ Compose와의 통합성이 뛰어남 (collectAsState())
✔ Flow 기반이므로 비동기 데이터 흐름에 최적화됨
 백프레셔(Backpressure) 처리 가능

📌 StateFlow의 단점:

  • Android 생명주기와 직접 연동되지 않음 (UI가 사라져도 Flow는 계속 동작)
  • 기존 프로젝트에서 LiveData를 많이 사용 중이라면 전환이 번거로울 수 있음

 

3. LiveData vs StateFlow 비교

📌 StateFlow가 더 나은 이유:  Compose와의 통합성이 뛰어남  collectAsState()로 쉽게 연동됨.
 항상 초기값을 가지므로 null 처리를 신경 쓸 필요 없음.
 Coroutine 기반이므로 백프레셔와 비동기 데이터 흐름을 자연스럽게 지원.
 Compose의 선언적 방식과 더 잘 맞음.

 

4. 언제 LiveData를 써야 할까? (LiveData가 여전히 적합한 경우)

LiveData가 완전히 사라져야 하는 것은 아닙니다.
아직도 LiveData가 적합한 경우가 있습니다.

✔ LiveData가 적합한 상황

1️⃣ 기존 코드베이스에서 LiveData를 많이 사용 중인 경우

  • 프로젝트가 LiveData에 강하게 의존하고 있다면, 한 번에 StateFlow로 바꾸는 것이 비효율적일 수 있음.

2️⃣ Android 생명주기(LifecycleOwner)와의 자동 연동이 필요한 경우

  • LiveData는 Activity/Fragment가 활성화될 때만 동작하므로 UI가 사라지면 자동으로 데이터 업데이트가 중지됨.

3️⃣ 간단한 UI 상태 관리

  • 간단한 데이터 바인딩 수준에서는 LiveData도 충분히 사용 가능.

 

 

📌 정리: 

 LiveData는 기존 코드와의 호환성이 필요할 때 유용하지만, Compose에서는 StateFlow가 더 적합하다.
 StateFlow 초기값이 있고, null-safe하며, Flow 기반이라 비동기 처리가 쉬워 Compose와 완벽하게 연동된다.
 새로운 프로젝트에서는 StateFlow를 기본 선택지로 사용하는 것이 바람직하다. 

반응형