Jetpack/ LiveData, MutableLiveData, Databinding, BindingAdapter
Android/Android Jetpack

Jetpack/ LiveData, MutableLiveData, Databinding, BindingAdapter

728x90
반응형

LiveData/ MutableLiveData

 

MutableLiveData는 Abstract Class 인 LiveData를 구현한 Public Class 라는 말을 풀어 보면,
LiveData는 추상 클래스이므로 직접 생성할 수 없다. 
반면에 MutableLiveData는 일반 클래스이므로 아래와 같이 직접 생성하고 초기화도 할 수 있다.


LiveData는 변경될 수 없고, MutableLiveData는 변경될 수 있다는 말의 의미는

LiveData는 주어진 라이프사이클(lifecycle) 내에서 관찰(observer)할 수 있는 data Holder 역할을 하는데,
LiveData에 데이터를 Set 할 수 있는 것은 이를 구현한 클래스에서 setValue/postValue를 통해서만 가능하다는 의미이다.


결국 관찰자가 사용하는 것은 모체인 LiveData로 동일 하나, 데이터를 쓸 수 있느냐의 문제라는 말의 의미를
ViewModel에서 바라보면,
ViewModel은 변경이 불가능한 LiveData 객체만 외부 관찰자에게 노출해야 한다.
즉, 외부(view 등)에서 LiveData는 변경이 불가능하게 해야 만들어야 한다는 것이다.
하지만, 이름이 LiveData인데 변경이 불가능하다면 의미가 없지 않은가?
그렇다면, LiveData의 데이터 변경은 누가 하는가?
Room 라이브러리를 사용한다면 Room의 데이터가 바뀌면 해당 LiveData로 바뀐 Data를 즉시 수정해준다.
Room 같은 라이브러리를 사용하지 않는다면 viewModel에서 MutableLiveData를 생성해서 LiveData와 연결 한 뒤, 모델의 로직에 따라 MutableLiveData를 수정해주면 된다.


즉, LiveData는 public으로 MutableLiveData는 private으로 선언해서

외부에서는 관찰을, 내부에서는 수정을 하는 방식이 되어야 한다는 말이다.


결국, LiveData는 ViewModel과의 연결 고리가 되는 Data Holder 역할이고, 

MutableLiveData는 이 Data Holder에 값을 채우는(수정) 역할을 한다는 말이 된다.


LiveData와 MutableLiveData를 연결하는 또 다른 방법은
위에서도 언급한 MutableLiveData를 생성해서 LiveData에 직접 할당하는 방법을 사용하거나,
lifecycle.transformation의 switchMap을 사용하여 MutableLiveData가 변경될 경우 LiveData를 반환하면 된다.

ViewModel에서 본 LiveData와 MutableLiveData는
외부와의 연결 고리(관찰자 제공및 Room 라이브러리의 데이터를 받는) 역할을 할 것이냐, 직접 가공하고 가공되는 데이터(setValue/postValue)로서의 역할을 할 것이냐에 따라 다르게 사용하면 된다.


binding에 LifeCycleOwner을 지정해줘야 LiveData가 실시간으로 변화

 

 

Databinding

 

데이턴 바인딩은 데이터를 xml 상에 바로 연동시키는 작업을 말합니다.

자바 코드상에서 textView.setText() 해줄 필요 없이 데이터만 변경해 주면 자동으로 xml 로 연결된다. 

 

 

 

BindingAdapter 

간단히 말하면, BindingAdapter는 뷰에 어떤 값들을 적용할 것인지를 조작하기 위한 메서드이다.

앱 개발을 하다보면 정적으로 떤 값을 뷰에 적용하는 것보다는 일정 조건에 따라 다른 값을 적용하고자 할 경우가 있다. 이 때 BindingAdapter가 사용되게 된다.

BindingAdapter에 뷰의 값 및 설정을 정의하기 때문에 View가 있는 Activity의 코드가 간결해지고, 중복 코드를 제거할 수 있다

 

 

참고

https://comoi.io/300

https://temidjoy.medium.com/android-jetpack-empower-your-ui-with-android-data-binding-94a657cb6be1

 

 

 

728x90
반응형