본문 바로가기
Android

LiveData와 Flow 어떤 걸 써야할까?

by kkong93 2023. 9. 29.
반응형

LiveData
LiveData는 Android Architecture Components의 일부로서, 생명주기를 고려한 데이터 홀더 클래스입니다. 주로 UI와 데이터 상태의 일치를 유지하는 데 사용됩니다.

LiveData의 특징
1. 생명주기를 고려: LiveData는 `LifecycleOwner` (액티비티, 프래그먼트 등)의 생명주기 상태를 파악하고, 액티비티가 활성 상태일 때만 업데이트를 보냅니다.
2. 메모리 누수 방지: 자동으로 생명주기와 연결되어 있으므로 메모리 누수가 덜 발생합니다.
3. 캡슐화: LiveData는 변경 불가능한 데이터를 제공하여 캡슐화를 잘 지킵니다.

 

LiveData 더 자세히 알아보기

https://developer.android.com/topic/libraries/architecture/livedata?hl=ko 



Flow
Flow는 Kotlin Coroutines 라이브러리의 일부로서, 비동기 데이터 스트림을 표현합니다. Flow는 cold 스트림이며, 구독자가 있을 때만 데이터를 생성합니다.

Flow의 특징
1. 코루틴과 통합: Flow는 코루틴과 자연스럽게 작동하므로, 비동기 작업을 더 간단하고 효율적으로 할 수 있습니다.
2. 백프레셔 지원: Flow는 비동기 데이터 처리 시 백프레셔를 자연스럽게 다룰 수 있습니다.
3. 함수형 연산자: `map`, `filter`, `transform` 등 다양한 함수형 연산자를 제공합니다.

차이점
1. 생명주기: LiveData는 생명주기를 자동으로 관리하지만, Flow는 그렇지 않습니다.
2. 코루틴 지원: Flow는 코루틴과 통합이 잘 되어 있으나 LiveData는 그렇지 않습니다.
3. 백프레셔: Flow는 백프레셔를 처리할 수 있지만, LiveData는 그렇지 않습니다.
4. 함수형 연산자: Flow는 다양한 함수형 연산자를 제공하는 반면, LiveData는 제한적입니다.

현재 많이 사용되고 있는 형태
- LiveData: 주로 UI 레이어에서 생명주기와 관련된 간단한 작업에 사용됩니다.
- Flow: 비즈니스 로직, 백그라운드 작업, 더 복잡한 연산을 다룰 때 주로 사용됩니다.

최근에는 Flow가 더 많은 관심을 받고 있습니다. 특히 클린 아키텍처와 같은 모던한 아키텍처 패턴에서는 Flow가 더 적합한 경우가 많습니다.


 

 

LiveData 사용예시 (ex.카운터)

: ViewModel에서 LiveData를 사용하여 간단한 카운터 구현

class LiveDataViewModel : ViewModel() {

    private val _count = MutableLiveData<Int>(0)
    val count: LiveData<Int> = _count

    fun increment() {
        _count.value = (_count.value ?: 0) + 1
    }
}
class LiveDataActivity : AppCompatActivity() {

    private lateinit var viewModel: LiveDataViewModel

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

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

        viewModel.count.observe(this, Observer { count ->
            // UI 업데이트
            println("Current Count: $count")
        })
    }
}

Flow

ViewModel에서 간단한 카운터 구현

class FlowViewModel : ViewModel() {

    private val _count = MutableStateFlow(0)
    val count: StateFlow<Int> = _count

    fun increment() {
        _count.value += 1
    }
}
class FlowActivity : AppCompatActivity() {

    private lateinit var viewModel: FlowViewModel

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

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

        lifecycleScope.launchWhenStarted {
            viewModel.count.collect { count ->
                // UI 업데이트
                println("Current Count: $count")
            }
        }
    }
}

LiveData는 observe 메소드를 사용하여 UI를 업데이트하며, 생명주기를 자동으로 관리합니다.
Flow는 코루틴 스코프 내에서 collect 함수를 사용하여 데이터를 수집합니다. 생명주기 관리는 수동으로 해야 하며, lifecycleScope나 viewModelScope 등을 활용할 수 있습니다.

반응형

댓글