UI는 항상 상태(State)의 결과물입니다. 로딩 중인지, 데이터가 있는지, 에러가 발생햇는지에 따라 화면은 서로 다른 모습으로 그려집니다.
안드로이드에서는 이러한 상태 변화를 UI에 전달하기 위해 LiveData와 StateFlow라는 두 가지 대표적인 도구를 제공합니다.
이번 글에서는 상태(State)라는 개념을 중심으로 LiveData와 StateFlow의 차잊머과 선택 기준을 정리해보겠습니다.
UI에서 말하는 상태란
화면을 그리기 위해 필요한 현재값
예를 들면 다음과 같습니다.
이 상태가 변경되면 UI는 그에 맞게 다시 그려져야 합니다. LiveData와 StateFlow는 바로 이 상태 변화를 UI에 전달하기 위한 도구입니다.
LiveData는 Android Jetpack에서 제공하는 안드로이드 생명주기에 최적화된 데이터 홀더입니다.
위와 같은 특징이 있지만, 안드로이드 플랫폼에 종속적이라 순수 Kotlin 환경(Unit Test 등)에서 사용하기 까다롭고, 복잡한 데이터 변환(연산)을 처리하기에는 다소 부족합니다.
StateFlow는 Coroutine 기반의 현대적인 상태 관리 스트림으로, Kotlin Coroutine 라이브러리에서 제공하는 상태를 보관하는 Flow입니다. LiveData와 유사하지만 더 유연합니다.
LiveData에 비해 더 유연하지만 기본적으로 생명주기를 인식하지 않기 때문에, UI에서 사용할 때는 repeatOnLifecycle 같은 API를 통해 생명주기에 맞춰 Collect하도록 처리해야 합니다. 처음엔 번거로워 보이지만, 언제 수집하고 언제 멈출지 명확하게 제어할 수 있다는 장점이 됩니다.
LiveData와 StateFlow는 서로 대체 관계라기보다, 프로젝트의 구조와 기술 스택에 따라 선택해야 할 상태 관리 도구입니다.
LiveData는 안드로이드 생명주기에 밀접하게 결합되어 있어 기존 XML 기반 UI나 레거시 프로젝트에서 여전히 유효한 선택지입니다. 반면 StateFlow는 Coroutine을 중심으로 한 현대적인 아키텍처에서 상태를 더 명확하고 유연하게 표현할 수 있는 도구입니다.
중요한 것은 어떤 도구를 쓰느냐보다, 상태를 명확히 정의하고, 그 상태에 따라 UI를 일관되게 그리는 구조를 만드는 것입니다. 이 기준을 잡고 있다면, LiveData든 StateFlow든 상황에 맞게 올바른 선택을 할 수 있을 것입니다.