이번 공부 노트는 안드로이드에서의 비동기 개발 시 필수적으로 들어가는 Flow, LiveData 차이점에 대해 적어보겠다.
# LiveData와 Flow 차이점
1. 플랫폼 독립성
- Flow : Kotlin 코루틴 기반의 라이브러리로, Android에 종속되지 않고 어디서든 사용할 수 있다.
- LiveData : Android에 특화된 라이브러리로 Android 프레임워크에 종속적이기 때문에 안드로이드 생명주기(Lifecycle)와 깊이 연관되어 있다.
2. 생명주기 인식
- Flow : 생명주기를 인식하지 않는다. 이는 Flow를 사용하려면 수동으로 생명주기를 관리하거나 lifecycleScope와 같은 코루틴 스코프를 사용해 생명주기에 맞게 구독을 제어해야 한다.
- LiveData : Android 생명주기를 자동으로 인식한다. 즉, Activity나 Fragment가 활성 상태일 때만 데이터를 구독한다.
3. Cold vs Hot Stream
- Flow : Cold Stream이다. 즉 구독자가 생기기 전에는 아무런 데이터도 발생하지 않으며 구독을 시작하는 순간부터 데이터를 방출한다.
- LiveData : Hot Steram이다. 즉 구독자가 없더라도 데이터는 계속 유지되고 구독자가 생기면 그 시점의 최신 데이터를 즉시 전달 한다.
4. 에러처리
- Flow : try-catch 블록이나 onEach, catch와 같은 연산자를 사용해 에러를 쉽게 처리할 수 있다.
- LiveData : 에러 처리를 위한 내장 API가 없으므로 에러를 직접 관리해야 한다.
5. 연산자의 다양성
- Flow : map, filter, flatMap, combine, zip, debounce 등 다양한 연산자를 제공
- LiveData : 변환함수 (map, switchMap)가 제한적이다.
# 차이점 요약
Flow | LiveData | |
플랫폼 | Kotlin 전반에서 사용 가능 (Android 종속 X) | Android 전용 |
생명주기 인식 | 생명주기 인식 없음 (직접 관리 필요) | Android 생명주기 인식 자동 관리 |
데이터 스트림 | Cold Stream | Hot Stream |
에러 처리 | catch 등의 연산자로 에러 처리 가능 | 별도의 에러 처리 메커니즘 없음 |
연산자 | map, filter 등 다양한 연산자 제공 | 제한적(map, switchMap 등 일부 제공) |
# 언제 Flow를 사용하고 언제 LiveData를 사용해야 할까?
## Flow
- 복잡한 비동기 처리 및 연산이 필요한 경우 (다양한 연산자)
- 네트워크 통신, 데이터베이스 작업 등에서 데이터 흐름을 제어해야 할 때 (생명주기 인식)
## LiveData
- 라이프사이클 관리를 신경 쓰기 싫을 때 (생명주기 인식)
- 단순한 데이터 처리 및 UI 갱신이 필요할 때
공부하기 전에는 언제 Flow를 사용해야 하는 정확히 구분이 가지 않았는데 이렇게 정리해놓고 보니 조금은 구분이 가능해진 것 같다!
