LiveData 대신에 StateFlow/SharedFlow를 사용해보자

KotlinDeepDive #3 — StateFlow/SharedFlow vs LiveData

우선 글 진행에 앞써, 왜 LiveData 대신에 StateFlow 혹은 SharedFlow를 써야 할까? 우리가 흔히 쓰던 LiveData는 ViewModel에 주로 위치한다. 하지만 ViewModel은 View과 연관이 없어야 하고, 보통 View는 android.~~ 임폴트를 갖는다. LiveData 역시 androidx.lifecycle.livedata 임폴트를 갖는다. 두 번째 이유는 ViewModel은 presentation 계층에 속하게 되고, presentation 계층은 ui와 domain 사이를 연결해주는 역할이니 platform independence 해야한다. 하지만 LiveData를 쓰게 되면 androidx 임폴트가 붙어 안드로이드에 platform aware 한 상태가 된다. 이러한 이슈들이 있어 LiveData 대신에, 코틀린에서 비슷하게 지원하는 StateFlow와 SharedFlow를 사용하여 대체해보겠다.

기본 개념

상태

이벤트

이를 통해서, 상태는 Cold를 따르고 이벤트는 Hot을 따른다는걸 유추할 수 있다. 상태가 Hot으로 작동했다면 구독하기 전까지 발생했던 상태를 받을 수 없어서 구독이 늦을 경우 이전 상태를 처리 못하는 이슈가 생길 것이고, 이벤트가 Cold로 작동했다면 우리가 키보드가 포커싱 돼있지 않은 상태에서 아무렇게나 막 쳤다가 키보드가 포커싱이 된다면 이전에 막 쳤던 타자들이 한 번에 다 입력될 것이다.

StateFlow

SharedFlow

마무리

위와 같이 lifecycleScope.launchWhenCreated { repeatOnLifecycle(Lifecycle.State.CREATED)를 사용하여 생명주기에 맞게 구독하게 만들어 줄 수 있다.

iOS 개발자를 꿈꾸는 토스팀 안드로이드 취준생 / github.com/jisungbin

iOS 개발자를 꿈꾸는 토스팀 안드로이드 취준생 / github.com/jisungbin