MVVM을 학습하다 보면 데이터는 늘 LiveData를 사용한다. LiveData는 무엇일까? 안드로이드 디벨로퍼 사이트의 문서의 첫 설명에는 다음과 같이 설명하고 있습니다.
LiveData
는 관찰 가능한 데이터 홀더 클래스입니다. 관찰 가능한 일반 클래스와 달리 LiveData는 수명 주기를 인식합니다. 즉, 활동, 프래그먼트, 서비스 등 다른 앱 구성요소의 수명 주기를 고려합니다. 수명 주기 인식을 통해 LiveData는 활동 수명 주기 상태에 있는 앱 구성요소 관찰자만 업데이트합니다.
즉, 앱의 구성요소의 LifeCycle 내에서 동작하고 LifeCycle이 종료되면 같이 삭제가 됩니다. 이러한 특성으로 인해 다음과 같은 이점들이 존재합니다.
Live Data의 이점
1. UI와 데이터 상태의 일치 보장
Live데이터는 관찰자 패턴을 따르기 때문에 기본 데이터가 변경될 때 Observe객체에 알립니다. 코드를 통합하여 이러한 Observer 객체에 UI를 업데이트 할 수 있습니다. 그러면 데이터가 변경될 때마다 관찰자가 대신 UI업데이트를 해줍니다. 개발자가 신경쓰지 않아도 됩니다.
2. 메모리 누수 없음
Observer는 LifeCycle객체에 결합되어 있으며 연결된 수명 주기가 끝나면 자동으로 삭제된다.
3. 중지된 활동으로 인한 비정상 종료 없음
activity가 백스택에 있을 때를 비롯하여 observer가 수명 주기가 비활성화 상태에 있으면 관찰자는 어떤 LiveData이벤트도 받지 않습니다.
4. 수명주기를 더이상 수동으로 처리하지 않음
UI구성요소는 관련 데이터를 관찰하기만 할 뿐 중지하거나 다시 시작하지 않습니다. LiveData는 관찰하는 동안 관련 수명 상태의 변경을 인식하므로 이 모든 것을 자동으로 관리합니다.
5. 최신 데이터 유지
수명 주기가 비활성화에서 다시 활성화될 때 최신 데이터를 수신합니다. 예를 들어 백그라운드에서 포그라운드로 돌아온 직후 최신 데이터를 받습니다.
6. 적절한 구성 변경
기기 회전과 같은 구성 변경으로 인해 Activity 또는 Fragment가 다시 생성되면 사용 가능한 최신 데이터를 즉시 받게 됩니다.
7. 리소스 공유
앱에서 시스템 서비스를 공유할 수 있도록 싱글톤 패턴을 사용하는 LiveData객체를 확장하여 시스템 서비스를 래핑할 수 있습니다.
LiveData 사용
class MainViewModel: ViewModel() {
private val _num = MutableLiveData<Int>()
val num: LiveData<Int> = _num
init{
_num.value = 0
}
fun incNum() {
_num.value = _num.value?.plus(1) ?: 1
}
fun decNum() {
if(_num.value == 1) return
_num.value = _num.value?.minus(1)
}
}
위 코드는 숫자를 증가, 감소 시키는 단순한 코드이다.
LiveData를 사용하는데 왜 MutableLiveData<>()를 통해 생성과 초기화를 하는가? 이는 LiveData는 추상클래스이기 때문이다. 추상클래스는 직접 생성할 수 없고 이를 상속하는 하위 클래스에서 구체화 시켜야한다. (추상클래스는 추후 알아보자) 반면 MutableLiveData는 LiveData를 상속받아 구체화 시킨 클래스이기에 생성과 초기화가 가능하다.
public abstract class LiveData<T> {}
public class MutableLiveData<T> extends LiveData<T> {}
LiveData를 사용하는 방법은 다음과 같다.
// 1. Room에서 생성한 LiveData를 할당
val num = repository.getNum()
// 2. MutableLiveData를 생성하여 LiveData에 연결하는 방법
private val _num = MutableLiveData<Int>()
val num: LiveData<Int> = _num
MutableLiveData와 LiveData는 ‘_’를 통해 구분해준다.
2번의 경우 ViewModel외부에는 변경이 불가능한 LiveData만 노출함으로써 안정성(?)을 높일 수 있다. view에서는 LiveData의 변화만 감지하여 적절한 대응을 하면 된다.
참조
LiveData와 MutableLiveData - https://comoi.io/300
android devellopers LiveData - https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
Uploaded by N2T