[안드로이드] LiveData
MVVM을 이해하기 위해 알아보는 LiveData
추후 더 자세한 내용을 정리할 예정.
# LiveData란?
직역하면 살아있는 데이터? 이렇게 생각할 수 있다. LiveData는 LifeCycle을 알고 있는 DataType이라고 생각하면 좋다. 이처럼 LifeCycle을 알고 있으면 필요할 때 변경하고 필요하지 않을 때 변경하지 않을 수 있다.
또한, LiveData는 Observer 패턴을 따른다. 즉 데이터의 변경이 일어났을 때 콜백으로 받아 처리할 수 있다. 이렇게 데이터의 변경이 일어날때마다 콜백을 실행하는데 LifeCycle을 알고 있기 때문에 필요하지 않을 때는 콜백이 실행되지 않는다.
예를 들어 Activity에 선언되어 있는 LiveData의 경우 Activity가 Start, Resume 상태일 때는 콜백을 실행하지만 다른 액티비티로 넘어가 있는 onStop 등의 상태일 때는 실행되지 않는다.
- postValue : 간단히 데이터가 변경된다.
이렇듯 onStart, onResume의 상태일 때 A와 B를 받는 옵저버 콜백은 실행되지만 onStop일 때 C와 D일 때는 실행되지 않고(옵저버 되지 않음) 다시 액티비티가 실행되면 가장 최신의 데이터인 D를 실행한다.(옵저버 됨) 이렇듯 LiveData를 사용하면 RxJava나 Interface Callback을 사용할 때 보다 더 깔끔하게 처리할 수 있다.
# 간단한 예제
1 | class UserProfileViewModel : ViewModel(){ |
- 위와 같은 데이터를 Activity에서 받으려면
1 | class PostActivity() : AppCompatActivity(){ |
LiveData 콜백을 실행하는 방법은 아래처럼 두 가지가 있다.
1 | // MutableLiveData에ㅓ setValue, postValue 실행 하는 경우 |
사실 LiveData를 더 잘쓰려면 데이터바인딩과 함께 사용해야 좋은 효과를 낼 수 있다. 왜냐하면 위에서처럼 Observe 패턴을 이용해서 UI를 직접 변경해줄 필요 없이 xml 상에서 깔끔하게 처리할 수 있다.
1 | <TextView |
이처럼 아주 깔끔하게 선언할 수 있다 이제 title이 변경되는대로 TextView UI는 알아서 변경이 된다.
그렇다면 LiveData Observer UI(Activity, Fragment)가 사라진다면? 더 이상 새로운 데이터를 발행하지 않는다. rx로 따지면 Dispose가 필요없다. 즉, 데이터를 더 이상 발행하지 않기 때문에 알아서 구독을 해지하는 것으로 생각이 든다.
# LiveData 변형하기
간단하게 살펴보고 추후에 자세하게 살펴보도록 하겠다.
Map
- LiveData의 변경을 다른 LiveData에게 알려주는 메소드.
1 | val userLiveData : LiveData<User> = ... |
UserLiveData의 변경사항을 Observe해서 map 함수를 통해서 원하는 값으로 변경한 뒤 String을 리턴한다. 즉, 새로운 LiveData를 리턴하는게 아니라 데이터만 변경한다.
SwitchMap
- LiveData의 변경사항을 받아서 다른 LiveData를 발행한다. 일반적으로 RoomDatabase를 LiveData로 쓸 때 많이 사용된다고 한다.
1 | val userIdLiveData : MutableLiveData = ... |
SwitchMap은 데이터의 인자값에 따라 다른 LiveData를 발행한다. repository.getUserById(id)는 RooDatabase에서 ID 값에 따라 유저값을 가져오며 return 값이 LiveData이다. 즉, 인자 값에 따라서 다른 데이터 소스(LiveData)를 보낼 수 있다.
MediatorLiveData
- 여러 데이터 소스를 한 곳에서 Observe할 때 사용한다.
1 | val liveData1:LiveData = ... |
예를 들어 Fragment별로 LiveData
LiveData는 많은 기능이 있는 것 같다. 하지만 혼자 쓰기 보다는 DataBinding, ViewModel과 함께 MVVM 패턴에서 사용될 때 효과가 더욱 두드러질 것 같다는 생각이 든다.
LiveData와 관련된 자세한 내용을 추후에 공부해서 올릴 예정이다.
앞으로도 열심히하길~