[MVVM 정복] 1. LiveData와 SingleLiveEvent
728x90
반응형

MVVM에서 데이터가 변경되는 시점에 UI가 변경되도록 하기 위해서 LiveData를 사용한다. 그런데 LiveData의 특성상 시도때도 없이 이벤트를 발생시킬 수 있기 때문에 SingleLiveEvent라는 것을 보통 만들어 쓴다. 여기서는 이 SingleLiveEvent의 용도를 확인해보자.

 

LiveData.

Data의 변경을 관측할 수 있는 (데이터가 변경되었을 때 감지가 됨)

Data Holder 클래스. (데이터를 가지고 있음)

변경을 감지할 수 있는 이유는 컴포넌트의 생명주기를 LiveData가 알고 있기 때문이다.

 

LiveData는 Observer 패턴을 가지기 때문에 데이터의 변경이 있을 시 콜백으로 받아서 처리할 수 있다.

옵저버 등록과 관련하여 다른 블로그에서 설명한 글을 가지고 와 보자. (나보다 설명을 잘한다.)

LiveData 객체에 LifecycleOwner와 함께 옵저버를 등록할 수 있습니다. LifecycleOwner가 추가된 LiveData는 DESTROYED 상태가 되면 자동으로 제거 됩니다. 이점은 메모리 누수에 관해 걱정할 필요가 없으며, 특히 UI컴포넌트(액티비티, 프레그먼트) 등을 사용할 때 유용합니다.

생명주기에 따라 UI가 갱신되던 것이 옵저버에 의해 데이터가 변경될 때마다 갱신되는 것으로 만들 수 있다.

이 LiveData를 왜 알아야 할까?

바로 SingleLiveEvent를 이해하기 위해서이다.

 

SingleLiveEvent

코드는 내 깃헙에 남겨두었다.

 

LiveData를 사용하다보면 View의 재활성화 (start나 resume 상태로 재진입)가 되면서 LiveData가 observe를 호출하여, 불필요한 Observer Event까지 일어나는 경우가 있다. 이를 방지하기 위해 존재하는 것이 SingleLiveEvent이다.

 

SingleLiveEvent는 MutableLiveData를 상속받는다. LiveData는 값을 변경하지 못하지만 MutableLiveData는 postValue(in Worker Thread) , setValue(in MainThread) 메서드를 이용해서 값을 변경할 수 있다.

 

즉 postValue나 setValue, call등을 통하여 setValue 함수를 거쳐야만이 Observer을 통하여 데이터를 전달 할 수 있으며, 이는 Configuration Changed 등의 LifeCycleOwner의 재활성화 상태가 와도 원치 않는 이벤트가 일어나는 것을 방지할 수 있도록 해줍니다. ('치킨과 개발의 상관관계' 블로그)

 

Atomic Type

MVVM과 관련되어 있다기 보다는 동시성 문제를 해결하기 위한 도구로 생각하면 된다. 멀티스레딩과 같은 상황에서 동시에 한 자원에 접근하면 생길 수 있는 이슈에 명확하게 구분할 수 있는 도구가 Atomic Type이다. (참고 : 준비된 개발자 블로그) CAS(Compare And Swap) 방식이라는 용어가 있지만 이건 지금 중요한 것은 아니기 때문에 앞에 언급한 블로그에서 알아보도록 하자.

 

결국 여기서 중요한 것은 Atomic Type에서 제공하는 메소드이다. 대표적으로 compareAndSet가 있다.

compareAndSet(boolean expect, boolean update) 

이 메소드는 expect 값과 비교해 같을 경우에 update값으로 변경을 한다. 이렇게 되면 동시에 접근을 해도 무조건 compare가 진행되기 때문에 동시성 문제에서 벗어날 수 있다.

 

참고자료
https://medium.com/harrythegreat/jetpack-android-livedata-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-ed49a6f17de3
https://www.charlezz.com/?p=363
https://hyuncb.tistory.com/4
https://zladnrms.tistory.com/146

 

728x90
반응형