질문 정리

State와 StateFlow 차이

five2week 2024. 5. 30. 19:22

정리 이유

안드로이드 개발 과정에서 State와 StateFlow를 상황에 맞춰 선택적으로 사용해왔습니다. 하지만 이 두 기술을 사용하는 구체적인 이유와 상황을 타인에게 명확히 설명하는 것이 어려웠기 때문에, 이에 대해 다시 조사하고 이해를 정리하고자 합니다.

State

private val _change = mutableStateOf(false)
val change: State<Boolean> = _change 
  • 타입: State<T>는 Jetpack Compose에서 제공하는 타입으로, 값이 변경될 때 재구성을 유발할 수 있는 값을 보유합니다. Composable 함수에서 읽히며 값의 변화를 감지하여 UI를 업데이트하도록 설계되었습니다.
  • 사용법: 주로 Jetpack Compose에서 UI와 관련된 데이터를 위해 사용됩니다. 사용자와의 상호잣용을 인식하고 변경할 수 있습니다. 이러한 상태변화는 Composable 함수의 재구성을 유발하여 UI가 갱신됩니다. 하지만 액티비티나 프레그먼트의 생명 주기를 인식하지 못합니다.

StateFlow

private var _change = MutableStateFlow(false)
val change : StateFlow<Boolean> = _change 
  • 타입: StateFlow<T> 는 Kotlin 코루틴의 일부이며 상태 보유 관찰 가능 Flow입니다.
  • 생명 주기 인식: StateFlow는 Android의 생명 주기 맥락에서 생명 주기를 인식할 수 있어, 단지 UI만이 아니라 애플리케이션의 다른 부분에서 데이터를 관찰하는 데 적합합니다.
  • 사용법: 액티비티, 프래그먼트, 뷰 모델과 같은 애플리케이션의 다양한 구성 요소에서 데이터를 관찰하고 시간이 지남에 따라 변화를 관찰해야 할 때 적합합니다. StateFlow는 UI 또는 관찰자가 관찰을 시작할 때 항상 최신 상태를 가지고 있도록 보장합니다.

주요 차이점

  • 사용 범위: State는 UI와 Compose 범위에 더 제한되어 있어 사용이 더 단순하지만, 어플리케이션 내의 다양한 부분에서 데이터를 공유하고, 서로의 데이터 변경을 관찰하는 데이터 처리 측면에서는 덜 강력합니다. StateFlow는 서비스, 저장소, UI 구성 요소를 포함한 애플리케이션의 모든 부분에서 사용될 수 있어 더 유연하고 강력합니다.
  • 생명 주기 인식: StateFlow는 생명 주기를 인식하므로 Android 개발 맥락에서 State보다 더 강력합니다. State는 생명 주기 변화를 자체적으로 고려하지 않습니다.

State 사용 사례

  • Jetpack Compose UI: State는 주로 Jetpack Compose에서 UI 상태를 관리하는 데 사용됩니다. 이 타입은 값이 변경될 때 Composable 함수를 자동으로 재구성(recompose)하도록 설계되었습니다.
  • 단순 상태 저장 및 UI 반응: 단일 화면 내에서 사용자 입력이나 서버로부터의 간단한 데이터 응답을 처리하고 UI 업데이트를 트리거할 때 사용합니다.
  • 비동기 처리 없이 상태 관리: 비동기 로직이나 복잡한 상태 관리가 필요 없는 간단한 UI 상호작용에 적합합니다.

StateFlow 사용 사례

  • 앱 전반의 상태 공유: StateFlow는 여러 UI 컴포넌트나 애플리케이션의 다른 부분 간에 상태를 공유할 필요가 있을 때 사용됩니다. 예를 들어, 사용자 인증 상태나 네트워크 연결 상태 같은 애플리케이션의 전역 상태를 관리하는 데 유용합니다.
  • 반응형 프로그래밍: StateFlow는 Kotlin 코루틴과 통합되어 있어, 비동기 처리와 반응형 프로그래밍에 적합합니다. 데이터 스트림을 관찰하고 데이터가 업데이트될 때마다 반응하는 기능을 구현할 때 유리합니다.
  • 생명 주기 인식 및 자원 관리: Android의 생명 주기를 고려하여 자원을 효율적으로 관리할 수 있습니다. 예를 들어, 액티비티나 프래그먼트가 비활성화 상태일 때는 데이터 업데이트를 일시 중지할 수 있습니다.

적합한 상황 예시

  • State 예시: 사용자의 텍스트 입력을 받아서 화면에 표시하는 간단한 검색 바의 검색어를 State를 사용하여 관리합니다. 사용자 입력이 변경될 때마다 관련 Composable이 재구성됩니다.
  • StateFlow 예시: 사용자의 로그인 상태를 앱 전체에 걸쳐 추적하고 여러 화면에서 이 상태에 따라 다르게 반응해야 할 때 StateFlow를 사용합니다. 로그인 상태가 변경될 때마다 관련된 모든 UI가 업데이트될 수 있도록 합니다.