[Android] LiveData, StateFlow

MariGold·2025년 12월 22일

[Android]

목록 보기
16/20
post-thumbnail

UI는 항상 상태(State)의 결과물입니다. 로딩 중인지, 데이터가 있는지, 에러가 발생햇는지에 따라 화면은 서로 다른 모습으로 그려집니다.

안드로이드에서는 이러한 상태 변화를 UI에 전달하기 위해 LiveData와 StateFlow라는 두 가지 대표적인 도구를 제공합니다.

이번 글에서는 상태(State)라는 개념을 중심으로 LiveData와 StateFlow의 차잊머과 선택 기준을 정리해보겠습니다.


🚀 상태(State)란?

UI에서 말하는 상태란

화면을 그리기 위해 필요한 현재값

예를 들면 다음과 같습니다.

  • 로딩 중인가?
  • 데이터가 있는가?
  • 에러가 발생했는가?

이 상태가 변경되면 UI는 그에 맞게 다시 그려져야 합니다. LiveData와 StateFlow는 바로 이 상태 변화를 UI에 전달하기 위한 도구입니다.


🚀 LiveData란?

LiveData는 Android Jetpack에서 제공하는 안드로이드 생명주기에 최적화된 데이터 홀더입니다.

특징

  • 생명주기 인식 : Activity나 Fragment가 STARTED 또는 RESUMED 상태일 때만 데이터를 업데이트 합니다. (메모리 누수 방지 및 비정상 종료 예방)
  • 자동 구독 해제 : 화면이 파괴(Destory)되면 관찰도 자동으로 멈춥니다.
  • Main Thread 중심 : UI 업데이트에 특화되어 있어 주로 메인 스레드에서 동작합니다.

위와 같은 특징이 있지만, 안드로이드 플랫폼에 종속적이라 순수 Kotlin 환경(Unit Test 등)에서 사용하기 까다롭고, 복잡한 데이터 변환(연산)을 처리하기에는 다소 부족합니다.


🚀 StateFlow란?

StateFlow는 Coroutine 기반의 현대적인 상태 관리 스트림으로, Kotlin Coroutine 라이브러리에서 제공하는 상태를 보관하는 Flow입니다. LiveData와 유사하지만 더 유연합니다.

특징

  • 초기값 필수 : 상태가 항상 존재해야하므로 초기값이 반드시 필요합니다. (null 안전성 향상)
  • 순수 Kotlin : Android 의존성이 없어 Domain 레이어나 테스트 환경에서도 자유롭게 사용 가능합니다.
  • 강력한 연산자 : 코루틴의 연산자(filter, map, zip 등)을 활용해 데이터를 정교하게 가공할 수 있습니다.

LiveData에 비해 더 유연하지만 기본적으로 생명주기를 인식하지 않기 때문에, UI에서 사용할 때는 repeatOnLifecycle 같은 API를 통해 생명주기에 맞춰 Collect하도록 처리해야 합니다. 처음엔 번거로워 보이지만, 언제 수집하고 언제 멈출지 명확하게 제어할 수 있다는 장점이 됩니다.


🧭 언제 무엇을 써야 할까?

LiveData가 적합한 경우

  • 기존 XML 기반 레거시 프로젝트
  • DataBinding 중심 구조
  • Coroutine 도입이 어려운 환경

StateFlow가 적합한 경우

  • 신규 프로젝트
  • MVVM + Coroutine 기반
  • Jetpack Compose 사용
  • 상태와 이벤트를 명확히 분리하고 싶을 때

🎯 마무리

LiveData와 StateFlow는 서로 대체 관계라기보다, 프로젝트의 구조와 기술 스택에 따라 선택해야 할 상태 관리 도구입니다.

LiveData는 안드로이드 생명주기에 밀접하게 결합되어 있어 기존 XML 기반 UI나 레거시 프로젝트에서 여전히 유효한 선택지입니다. 반면 StateFlow는 Coroutine을 중심으로 한 현대적인 아키텍처에서 상태를 더 명확하고 유연하게 표현할 수 있는 도구입니다.

중요한 것은 어떤 도구를 쓰느냐보다, 상태를 명확히 정의하고, 그 상태에 따라 UI를 일관되게 그리는 구조를 만드는 것입니다. 이 기준을 잡고 있다면, LiveData든 StateFlow든 상황에 맞게 올바른 선택을 할 수 있을 것입니다.

profile
많은 것을 알아가고 싶은 Android 주니어 개발자

0개의 댓글