안드로이드에서 UI와 데이터를 효율적으로 관리하는 두가지 핵심요소 이다.
LiveData : 반응형 데이터 관리 (데이터 변경 감지 및 UI 자동 업데이트)DataBinding : UI와 데이터의 직접적인 바인딩 (xml에서 직접 연결)Lifecycle을 인식하는 반응형 데이터 홀더이다. 데이터가 변경되면 자동으로 UI가 업데이트되며, Lifecycle을 인식하여 메모리 누수를 방지한다.
ViewModel과 함께 사용하여 UI 데이터 관리 최적화LifecycleOwner와 연결)ViewModel에 LiveData를 선언 및 변경하고, 해당 값을 View에서 Observer 등록을 통해 값이 바뀔 경우 자동으로 UI를 업데이트하게 만들 수 있으며, View가 비활성화되면 Lifecycle을 통해 자동으로 관찰이 중단된다.
xml 레이아웃과 데이터를 직접 연결하는 기술로 xml에서ViewModel, LiveData 등을 참조할 수 있어 코드가 간결해진다.
LiveData와 함께 사용하면 xml에서 데이터 변경을 자동으로 감지하여 반영되고, 단뱡향(@{})뿐 아니라, 양방향 데이터 바인딩(@={})도 가능하다. 양방향 데이터 바인딩의 경우, 사용자가 입력한 값이 LiveData에 자동으로 반영된다.
View단에서 binding.lifecycleOwner = this로 설정해줘야 LiveData 변경사항이 자동으로 반영된다.
StateFlow도 LiveData와 동일하게 반응형 데이터 스트림을 제공하지만 동작 방식과 사용 목적이 다르다.
| LiveData | StateFlow | |
|---|---|---|
| 목적 | UI 상태 저장 및 변경 감지(Lifecycle-Aware) | UI 상태 또는 이벤트 처리 (Flow) |
| 초기 값 | 필요없음 | 필요함 |
| Lifecycle 인식 | UI 활성 상태에만 데이터 전달 | 인식하지 않음 |
| 콜드 스트림 여부 | observe()가 없어도 데이터 저장 | collect()를 호출해야 데이터 전달 |
| UI 비활성 상태 동작 | UI가 비활성화되면 값 전달 X | UI가 없어도 항상 최신 상태 유지 |
| 사용 | observe(viewLifecycleOwner) | flow.collect() |
위에서 주목해야하는 차이점은 LiveData는 UI가 onStop()상태가 되면 LiveData는 업데이트가 중단되며, UI가 다시 활성화되면 마지막값만 전달되지만, StateFlow는 항상 마지막 값을 유지하며 UI가 다시 활성화되면 즉시 최신 값이 전달된다는 점이다.
즉, LiveData는 UI와 직접 연결된 데이터를 관리할 때 적합하고, StateFlow는 UI와 무관하게 데이터 흐름을 유지해야할 때 적합하다.
Flow 기반의 데이터 스트림을 여러 구독자와 공유할 수 있는 핫 스트림으로 주로 일회성 이벤트 처리(토스트 메시지, 네트워크 응답 등)에 사용되며, StateFlow와 달리 이전 값을 저장하지 않고 새로운 값을 바로 전달한다.
| StateFlow | SharedFlow | |
|---|---|---|
| 초기 값 | 필요함 | 필요없음 |
| 이전 값 유지 | 항상 최신 값 유지 | 유지하지 않음 |
| 이벤트 기반 처리 | X | O |
| collect()동작 | 최신 값 즉시 전달 | 새로운 값이 들어올때만 전달 |
따라서 StateFlow로는 상태(State)를 관리하는데 적합하고, SharedFlow는 이벤트(Event)를 전달하는데 적합하다.
참고사항 : SharedFlow는 replay 설정을 통해 최근 값을 유지할 수 있다. (replay = 1)