brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Mar 14. 2021

안드로이드 LiveData

Android Jetpack

LiveData가 무엇인가?

LiveData는 데이터가 변경되면 알림을 받을 수 있는 DataHolder 클래스이다. (DataHolder 클래스는 어떤 동작은 거의 또는 전혀 하지 않고 데이터만 가지는 클래스이다.) 


알림 받는 것을 관찰한다고 표현하며 관찰 가능한 객체나 데이터를 나타내는 클래스는 Observerable 클래스이다. 그리고 Observerable 객체에 변경이 발생하는 것을 알려주고 싶을 때 사용되는 것이 Observer 인터페이스이다.


LiveData는 기본적으로 Observerable 클래스와 같이 동작한다. 중요한 차이점은 생명주기를 인식한다는 것이다. 어떻게 인식을 할까? Activity와 Fragment에는 LifecycleOwner 인터페이스가 기본적으로 구현되어 있다. LifecycleOwner는 getLifecycle() 메서드를 통해서 Lifecycle이라는 객체를 가져온다.


LiveData는 LifecycleOwner가 구현된 객체(Activity나 Fragment)와 연결되는 Observer를 등록할 수 있다. 따라서 Observer가 생명주기를 인식할 수 있다.


Observer가 인식한 생명주기가 STARTED나 RESUMED 상태이면 활성 상태라고 한다. LiveData는 활성 상태인 Observer에게만 변경사항을 알린다.


정리하면 다음과 같이 나타낼 수 있다.

LiveData  동작 구성도

LiveData 장점

LiveData의 이러한 특징 때문에 여러 장점이 있다.


1) 편리한 UI와 데이터 상태 동기화 

- 데이터가 변경될 때마다 Observer를 통해서 콜백을 받기 때문에 Observer에서 변경된 데이터로 UI를 업데이트하도록 구현하면 별도로 UI 업데이트에 대한 신경을 쓰지 않아도 된다.


2) 메모리 누수 없음

- Observer가 LifecycleOwner가 구현된 객체와 연결되어 있기 때문에 해당 객체의 생명주기가 destroy 되면 Observer도 메모리 해제된다.


3) 비활성 Activity에 의한 충돌 없음

- Observer의 생명주기가 비활성 상태일 때 LiveData의 어떤 이벤트도 수신하지 않는다.


4) 별도의 생명주기 관리 불필요 

- LiveData는 Observer를 통해서 생명주기의 상태 변경을 알고 있기 때문에 생명주기에 대해서 자동으로 관리한다.


5) 항상 최신 데이터 유지

- 생명주기가 비활성에서 활성으로 바뀌는 경우에 최신 데이터를 수신한다. 예를 들면 Activity가 백그라운드에 있다가 포그라운드로 오는 경우 또는 화면 회전으로 Activity가 다시 생성되는 경우에 최신 데이터를 받는다.


6) 리소스 공유

LiveData가 생명주기를 인식하기 때문에 여러 Activity, Fragment, Service에 LiveData를 공유할 수 있다. (앞의 3, 4 특징 덕을 보는 것이다.) 방법은 LiveData를 상속하여 커스텀 LiveData를 만들어서 사용할 Activity, Fragment, Service에 연결하면 된다.


간단한 예제

다음은 버튼을 눌렀을 때 LiveData의 값을 변경하여 이를 Observer가 알림을 받고 변경된 값을 버튼의 텍스트에 적용하는 간단한 예제이다. MutableLiveData는 값(value) 변경이 가능한 LiveData이다.


앞의 LiveData 동작 구성도를 참고하여 아래 부분의 코드를 자세히 보면 버튼을 클릭했을 때 LiveData 값 변경이 발생한다. 활성 상태의 Activity이므로 변경사항은 Observer에 전달된다. Observer는 변경사항을 수신해서 변경된 데이터로 UI를 갱신한다.

기본적인 사용법은 간단하다. LiveData 객체와 Observer 객체를 만든다. 그리고 LiveData 객체에 Observer 객체를 연결하기 위해 LiveData의 observer 함수에 첫 번째 인자로 LifecycleOwner을 가진 현재 Activity를 넘겨주고 두 번째 인자로 앞서 만든 Observer 객체를 넘겨준다. 그러면 해당 Activity가 활성화된 상태에서 LiveData의 값에 변경이 발생하면 이를 관찰하고 있던 Observer 객체가 알림을 받는다.

Observer 객체는 바로 인자에서 생성해주면 좀 더 깔끔하게 구현할 수 있다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari