LiveData와 StateFlow을 알아보자

312·2024년 5월 22일

Android 알아보기

목록 보기
4/7

기존에는 LiveDataViewModel에서 선언하고 사용하는 클래스에서 observer을 통해 LiveData의 상태 변화를 감지하는 방식을 애용했다.

최근에는 StateFlow를 활용해 UI를 만들었는데 어떤 차이가 있는지 알아보자.

LiveData?


LiveData는 수명 주기를 인식해서 필요한 클래스의 observer에서 관찰하고 클래스의 수명이 끝나면 observer도 함께 destroy 된다.

MVVM에서의 LiveDataViewModel 에서 선언하고 관리하며, View에서 LiveData의 변화를 observe 해서 UI에 반영해준다.

Why StateFlow?


그렇다면 StateFlow는 어떤 점이 다를까?

변경되지 않은 데이터의 관찰

먼저 StateFlow는 값의 변화가 없다면 업데이트 되지 않는다.

LiveData

private val _liveDataNumber = MutableLiveData<Int>(0)
val liveDateNumber = _liveDataNumber

fun number() {
	_liveDataNumber.value = _liveDataNumber.value
}

StateFlow

private val _stateFlowNumber = MutableStateFlow<Int>(0)
val stateFlowNumber = _stateFlowNumber.asStateFlow()

fun number() {
	_stateFlowNumber.value = _stateFlowNumber.value
}

두가지 같은 코드를 LiveDataStateFlow로 작성했을 때,
nubmer 함수를 호출했을때 로그를 찍어보았다.

처음 값을 할당할 때에는 둘다 로그가 찍히지만,
이후에 number 함수를 호출해주자 LiveData만 로그에 나타난다.

Flow를 활용한 안정된 비동기 스트림

Flow는 값을 순차적으로 방출하고 완료되는 비동기 데이터 스트림이기 때문에 Data Layer(ex: Repository, Room)에서도 쓸 수 있다.

또한, 코틀린의 코루틴 API이기 때문에 안드로이드 플랫폼에 종속적이지도 않다.

Hot Stream

LiveData와는 다른 Hot Stream이기 때문에 collect하는 클래스가 없어도 항상 데이터를 최신으로 유지하고 업데이트한다.

항상 안전한 최신 데이터를 보낼 수 있다..!

이외에도 초기값을 무조건 할당해야하고, 코루틴 내에서 보다 편하게 사용가능 하다는 등의 차별점이 있다.

LiveData 사용해보기

간단하게 사용하는 방법을 알아보겠다.

ViewModel

private val _liveDataText = MutableLiveData<Int>("")
val liveDataText = _liveDataText

fun updateText(text: String) {
    _liveDataText.value = text
}

Activity

lifecycleScope.launch { 
	viewModel.liveDateText.observe(this@MainActivity){
    	Log.d(TAG,"liveDateText: $it")
    }
}

lifecycleScope을 열어서 observer을 할당해준다.
이후에는 값이 업데이트 될때마다 로그에 나타나게 된다.

StateFlow 사용해보기

ViewModel

private val _stateFlowText = MutableStateFlow<String>("")
val stateFlowText = _stateFlowText.asStateFlow()

fun updateText(text: String) {
	_stateFlowText.value = text
}

Activity

lifecycleScope.launch {
	viewModel.stateFlowText.collect {
    	Log.d(TAG,"stateFlowText: it)
    }
}

Compose에서는 더 간단하게 활용이 가능하다.

StateFlow!

기존에는 LiveData만 활용한 개발을 했기 때문에 굳이 바꿔야하나 싶기도 했고 소규모 서비스였기에 데이터 스트림에 관한 문제도 겪지 못했기 때문에 필요성을 느끼지 못했었다.

하지만 Compose에서도 적용시켜보고 앞으로 StateFlow가 많은 개선점들 덕분에 주류가 되어가고 있기에 학습해보고 싶었다!

profile
안드로이드 개발자 이상일입니다.

0개의 댓글