[안드로이드] Flow와 LiveData

말랑돌·2025년 1월 28일

안드로이드 학습

목록 보기
5/17
post-thumbnail

LiveDataFlow는 둘 다 데이터의 비동기 스트림을 관리하고 UI와 데이터 간의 연결을 효율적으로 처리하는 데 사용되는 데이터 스트림 객체입니다. 하지만 그 동작 방식이나 사용되는 상황이 다릅니다. 아래에서 각각을 설명하겠습니다.


LiveData

LiveDataAndroid 아키텍처 컴포넌트의 일부로, UI와 관련된 데이터를 관찰하고, 해당 데이터가 변경될 때 UI를 자동으로 업데이트하는 데 사용됩니다.

특징:

  • UI 관찰: LiveData는 UI 컴포넌트에서 데이터의 변경을 감지하고, 변경이 발생하면 자동으로 UI를 업데이트합니다.
  • Lifecycle-aware: LiveDataLifecycle을 인식하여, UI가 활성화되어 있을 때만 데이터 변경 사항을 알립니다. 즉, 액티비티나 프래그먼트가 생명주기에 따라 자동으로 연결/해제됩니다. 이를 통해 메모리 누수를 방지합니다.
  • 단방향 데이터 흐름: LiveData는 기본적으로 단방향으로 데이터를 전달합니다. 즉, LiveData관찰하는 UI 컴포넌트변경된 데이터를 수신하지만, 데이터를 수정하거나 직접 변경할 수 없습니다.

사용 예시:

// ViewModel에서 LiveData 정의
class MyViewModel : ViewModel() {
    private val _data = MutableLiveData<String>("Initial Data")
    val data: LiveData<String> = _data

    fun updateData(newData: String) {
        _data.value = newData  // LiveData 값을 변경
    }
}

// UI에서 LiveData를 관찰
class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        viewModel.data.observe(this, Observer { newData ->
            // LiveData 값이 변경되면 자동으로 UI 업데이트
            textView.text = newData
        })
    }
}

장점:

  • Lifecycle-aware: LiveData는 컴포넌트의 생명주기를 인식하여 UI가 활성화되어 있을 때만 데이터 변경을 알립니다. 이로 인해 메모리 누수를 방지하고 효율적인 리소스 관리를 합니다.
  • 자동 UI 업데이트: 데이터가 변경될 때마다 자동으로 UI가 업데이트됩니다.

단점:

  • 제어 부족: LiveData변경된 데이터를 UI로 전달하는 역할만 수행합니다. 데이터의 흐름이나 변환을 세밀하게 제어하기에는 적합하지 않습니다.

Flow

FlowKotlin Coroutines에서 제공하는 비동기 스트림을 나타내는 API로, 비동기 데이터 스트림을 처리할 때 사용됩니다. LiveData와 달리, FlowKotlin의 코루틴과 결합되어 더 세밀한 비동기 작업을 처리할 수 있습니다.

특징:

  • 비동기 데이터 흐름: Flow비동기적인 데이터 흐름을 처리합니다. 비동기적인 작업에서 발생하는 데이터를 순차적으로 발행하고 이를 수집하는 방식으로 동작합니다.
  • suspend 함수와 결합: Flow는 코루틴과 밀접하게 연관되어 있으며, suspend 함수와 결합하여 비동기 작업을 처리합니다.
  • 다중 리스너 지원: Flow한 번의 발행으로 여러 구독자가 데이터를 받을 수 있습니다. 즉, 다중 리스너가 있을 때 매우 유용합니다.
  • StateFlowSharedFlow: Flow의 변형인 StateFlow(상태 흐름)와 SharedFlow(멀티 리스너 흐름)를 통해 상태 관리복수 리스너 지원 기능을 사용할 수 있습니다.

사용 예시:

// ViewModel에서 Flow 정의
class MyViewModel : ViewModel() {
    private val _data = MutableStateFlow("Initial Data")  // StateFlow 사용
    val data: StateFlow<String> = _data

    fun updateData(newData: String) {
        _data.value = newData  // Flow 값을 변경
    }
}

// UI에서 Flow를 수집
class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        lifecycleScope.launch {
            // Flow 수집 (비동기적으로)
            viewModel.data.collect { newData ->
                // Flow 값이 변경되면 UI 업데이트
                textView.text = newData
            }
        }
    }
}

장점:

  • 비동기 작업 처리: Flow는 코루틴을 기반으로 비동기 작업을 손쉽게 처리할 수 있습니다.
  • 단방향 및 양방향 데이터 흐름: Flow는 비동기적으로 데이터를 발행하고, 필요한 경우 데이터 변환이나 예외 처리 등을 세밀하게 제어할 수 있습니다.
  • 다중 리스너와 상태 관리: Flow는 여러 개의 리스너를 처리할 수 있으며, StateFlowSharedFlow상태와 이벤트 관리를 효과적으로 할 수 있습니다.

단점:

  • Lifecycle-awareness가 없음: FlowLiveData처럼 자동으로 Lifecycle을 관리하지 않으므로, 리소스를 관리하기 위해 lifecycleScope 등을 명시적으로 관리해야 합니다.

LiveData vs Flow

특성LiveDataFlow
라이프사이클 관리Lifecycle-aware (자동 관리)직접 관리 필요 (lifecycleScope 등)
데이터 흐름단방향 (UI 업데이트 중심)양방향 가능 (비동기 스트림, 변환 가능)
비동기 작업기본적으로 비동기 처리 아님완벽하게 비동기 처리 가능
변경 감지 방식데이터 변경 시 자동 UI 업데이트값 변경을 collect로 수동으로 처리
멀티 리스너 지원하나의 리스너에게만 전달다수의 리스너가 동시에 수집 가능
사용 예시UI 데이터 변경을 자동으로 반영하는 경우비동기적으로 데이터를 발행하고 처리하는 경우

결론

  • LiveDataAndroid UI 컴포넌트와의 상호작용을 쉽게 처리하기 위해 라이프사이클을 자동으로 관리하며, 단방향 데이터 흐름을 제공합니다. UI가 생명 주기에 맞춰 데이터를 자동으로 업데이트해야 할 때 적합합니다.
  • FlowKotlin Coroutines비동기 스트림으로, 더 복잡한 비동기 작업을 처리할 때 유용하며, 다양한 비동기 데이터를 변환하거나 여러 리스너에게 데이터를 전달하는 데 적합합니다.

0개의 댓글