LiveData는 관찰 가능한 데이터이다.
value라는 속성에 데이터를 유지하고 있으며, 이 데이터의 값이 변경되면 Observer는 알 수 있다.
LiveData는 안드로이드 생명주기(LifeCycle)를 알고있다.
즉, 액티비티나, 프래그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기(LifeCycle)를 인식하며 그에 따라 LiveData는 활성상태일때만 데이터를 업데이트(Update)한다.
(-> 활성상태란 STARRED 또는 RESUME을 의미)
또한 LiveData 객체는 Observer 객체와 함께 사용되는데 LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고, Observer의 onChanged() 메소드가 실행된다.
바로 LifeCycleOwner이라는 녀석이 안드로이드 생명주기 (Android LifeCycle)를 알고 있는 클래스라 보면 된다.
메서드가 오직 getLifeCycle() 밖에 없는 단일 메소드 인터페이스 클래스 이며, Activity나 Fragment에서 이를 상속하고있다.
한 마디로 LiveData의 Observer 메소드의 LifeCycleOwner를 Activity나 Fragment를 변수로써 사용한다면 각 화면 별 생명주기에 따라 LiveData는 자신의 임무를 수행
LiveData는 Observer 패턴을 따른다. 그에 따라 LiveData는 안드로이드 생명주기에 데이터 변경이 일어날 때마다 Observer 객체에 준다.
그리고 이 Observer 객체를 사용하면 데이터의 변화가 일어나는 곳마다 매번 UI를 업데이트하는 코드를 작성할 필요 없이 데이터의 상태와 UI를 일치시킬 수 있다.
Observer 객체는 안드로이드 생명주기 객체와 결합되어 있기 때문에 컴포넌트가 Destroy 될 경우 메모리상에서 스스로 해제
LiveData가 안드로이드 생명주기에 따른 Observing을 자동으로 관리를 해주기 때문에 UI 컴포넌트는 그저 관련 있는 데이터를 "관찰"하기만 하면 된다.
화면 구성이 변경되어도 데이터를 유지한다.
예를 들어, 디바이스를 회전하여 세로에서 가로로 화면이 변경될 경우에도 LiveData는 회전하기 전의 최신 상태를 즉시 받아올 수 있다.
LiveData를 통해서 UI를 업데이트하는 경우 일반적으로 Activity나 Fragment 내에서 직접 선언하는 것보다 ViewModel 내에서 정의하고 호출하여 사용하는 것이 더 좋습니다.
이유는 다들 ViewModel이 뭔지 알고 계시듯이 액티비티와 데이터 간의 결합도를 낮추고(의존성), UI Controller는 오직 data를 display만 하는 것을 수행하게 하는 안드로이드 아키텍처 패턴(디자인)을 유지하기 위해서이다.
LiveData는 단독으로 사용하는 것 보다 Databinding, ViewModel, RoomDatabase, Reactive Programing등과 함께 쓸 경우 그 진가가 발휘되며 개발자는 아주 편하게 코딩이 가능하기 때문에 UI 출력 데이터에 관한 실수 또한 줄여준다.
참고 : https://velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90