Jetpack Android — LiveData 알아보기

Harry The Great
해리의 유목코딩
5 min readDec 10, 2018

LiveData? 특이한 이름입니다. 살아있는 데이터? 네이밍을 어떻게 한건지는 모르겠지만 LiveCycle을 알고있는 DataType이라고하면 더 와닿을것같습니다. 그러면 LiveCycle을 알면 뭐가 좋은데?라는 생각이 드는데 낄끼빠빠 바로 필요할때 변경하고 필요하지 않을때 변경하지 않는다입니다.

LiveData는 Observer 패턴을 따릅니다. 즉 데이터의 변경이 일어났을때 콜백으로 받아 처리할 수 있습니다. 이렇게 데이터의 변경이 될때마다 콜백을 실행하는데 LifeCycle을 알기때문에 필요하지 않을땐 콜백이 실행되지 않습니다. 예를들어 Activity에 선언되어있는 LiveData의 경우 Activity가 Start, Resume 상태일때는 콜백을 실행하지만 다른 액티비티로 넘어가있는 OnStop 등의 상태일때는 실행되지 않습니다.

postValue는 간단히 데이터가 변경된다 라고만 알아두세요!

이렇듯 onStart, onResume의 상태일때 A와 B를 받는 옵저버 콜백을 실행되지만 C와 D일때는 실행되지 않다고 다시 실행됬을때 가장 최신의 데이터인 D를 실행합니다. 이렇듯 LiveData를 사용하면 Rx나 Interface Callback을 사용할때보다 더 깔끔하게 처리를 할 수 있습니다.

또한 ACC ViewModel에서 사용할경우 ViewModel을 만든 Acitivty나 Fragment의 LiveCycle과 동일하게 작동합니다.

간단한 예제

그럼 위와같은 데이터를 Activity에서 받으려면

LiveData 콜백을 실행하는 방법을 알아보겠습니다.

위와같이 MutableLiveData에 setValue 혹은 PostValue에서 실행하게되는데 두개의 차이점은 setValue에서는 UI Thread즉 Main Thread에서 실행하고 두번째는 Background Thread에서 처리합니다.

LiveData를 더 잘쓰려면 데이터바인딩!

Databinding에서 LiveData를 쓰면 더 편리합니다. 왜냐면 아까와같은 Observe 패턴을 이용해서 UI를 직접 변경해줄 필요 없이

아주 깔끔하게 선언할 수 있습니다. 이제 title이 변경되는대로 TextView UI는 알아서 변경이 됩니다.

그렇다면 LiveData Observer UI(Activity, Fragment)가 사라진다면? 더이상 새로운 데이터를 발행하지 않습니다 rx로 따지면 Dispose가 필요없습니다.

라이브데이터 변형하기

공문서에는.. Transformation이라고 하는데 어떻게 번역을 해야할지 난감하네요 변형하기라고 하겠습니다! 라이브데이터를 잘쓰긴 위해선 3가지만 기억하세요 북치기, 박치기,매치기가 아니라… map, switchmap, mediatorLiveData

Map

라이브데이터의 변경을 다른 라이브데이터에게 알려주는 메서드입니다.

UserLiveData의 변경사항을 Observe해서 함수를 통해 원하는값으로 변경한뒤 ‘String’을 리턴합니다. 즉 새로운 LiveData를 리턴하는게 아닌 데이터만 변경합니다.

SwitchMap

SwitchMap은 LiveData를 변경사항을 받아서 다른 LiveData를 발행합니다. 일반적으로 RoomDatabase를 LiveData로 쓸때 많이 사용합니다.

SwitchMap은 데이터의 인자값에 따라 다른 LiveData를 발행합니다. repository.getUserById(id)는 RoomDatabase에서 ID값에 따라 유저값을 가져오며 return값이 LiveData입니다. SwitchMap을 잘보면 LiveData값을 리턴하고있습니다. 따라서 인자값에따라 다른 데이터소스를 보낼 수 있습니다.

MediatorLiveData

여러 데이터 소스를 한곳에서 Observe할때 사용을합니다. 예를들어 Fragment별로 LiveData<Error>가 있고 이걸 Activity 한곳에서 Crashlistic에 기록한다거나 Toast메세지를 띄울때 Fragment의 LiveData를 Activity의 MediatorLiveData를 통해 사용할 수 있습니다.

마치며

LiveData를 그냥 LiveData만 쓰면 좋은점을 느끼기 힘든것같습니다 Databinding, ViewModel, RoomDatabase등과 함께쓸경우 그 진가가 발휘되며 10줄의 소스코드를 1~2줄로 바꾸는 위엄을 보여주게됩니다.

인용및 참고

https://www.youtube.com/watch?v=2rO4r-JOQtA Fun With LiveData

https://www.youtube.com/watch?v=OMcDk2_4LSk Android Jetpack:LiveData

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.