안녕하세요. 골드입니다. 오늘은 안드로이드에서 사용하는 LiveData에 대해서 정리하려고 합니다. LiveData는 이미 많은 분들이 사용하고 있을 것이라고 생각되는데요. 단순히 MVVM 패턴을 사용한다고 해서 기계적으로 ViewModel을 생성하고 변수를 LiveData로 래핑해서 Observe한 형식으로 만들어서 사용한 제 자신을 위한 글이기도 합니다.
1. LiveData를 사용하는 이유
LiveData를 사용하는 이유는 구글이 권장한 안드로이드 개발 방식인 이유도 있겠지만, 중요한 건 Observe하다는 것과 수명 주기를 인식하는 것이라고 생각됩니다.
- Observe하다는 것은 LiveData가 감싸고 있는 객체를 항상 최신 데이터로 유지할 수 있다는 뜻입니다. 해당 변수를 구독하고 있는 곳에서 변수가 변하는지 아닌지를 계속 관찰하고 있으며, 변수가 변경되었을 때 이를 관찰자에게 알리게 되고 관찰자는 이 변수가 변했다는 것을 알 수 있게 됩니다.
- 수명 주기를 인식한다는 것은 해당 LiveData를 사용하고 있는 곳의 수명 주기와 LiveData가 함께 한다는 뜻입니다. 예를 들어 Fragment - ViewModel로 이어진 하나의 코드 뭉치 안에서 LiveData는 ViewModel과 연결되어 있는 Fragment와 수명 주기를 함께 하고 이에 따라 Fragment의 수명 주기가 DESTROY로 변경될 때(대표적으로 화면을 돌리는 등) 관찰자를 삭제할 수 있습니다. 수명 주기가 활성 상태일 때는 변경 사항을 관찰자에게 알리고 수명 주기가 끝나는 즉시 수신 거부되어 누수 걱정이 없습니다.
LiveData의 장점 : 수명 주기를 인식한다. 최신 데이터를 유지할 수 있다.
2. MutableLiveData와 LiveData
Kotlin으로 개발한다면 이미 Mutable에 대해서 매우 친숙합니다. Mutable은 흔히 변경 가능한 이라고 알고 있고 LiveData도 마찬가지입니다. MutableLiveData는 setValue()와 postValue() 함수를 호출할 수 있습니다.
흔히 LiveData를 사용할 때 ViewModel 안에서 다음과 같이 사용하는 경우를 볼 수 있습니다.
private으로 MutableLiveData를 선언하고 이에 따라 LiveData에 값을 넣어주는 형식입니다. 이렇게 작성하는 이유는 은닉화에 이유도 있겠지만, 결국 비즈니스 로직에 대한 처리를 ViewModel과 그 이하에서 하기 위함입니다. 우리에게 관심사 분리는 매우 중요하니까요. 다만, 이 방법을 강제하는 것은 아닙니다. 필요한 경우 MutableLiveData를 선언하여 View의 변경사항에 대한 처리를 View 안에서 직접 넣어줄 수도 있습니다. 하나의 예제일 뿐이지만 꽤 의미있는 예제일 수도 있겠습니다.
3. setValue()와 postValue()
앞서 MutableLiveData는 setValue()와 postValue()를 호출할 수 있다고 말씀드렸습니다. 이는 둘 다 LiveData의 값을 변경하기 위해 사용하는 두 함수입니다.
- setValue : setValue는 반드시 Main Thread에서 호출되어야 하는 함수입니다. Main Thread에서 setValue()를 호출하는 즉시 LiveData의 값이 변경되어 해당 값을 참조할 수 있게 됩니다.
- postValue : postValue는 runnable 블럭 내에서 전달받은 값을 Main Thread에 전달한 후 setValue를 호출합니다. 한 마디로 백그라운드에서 전달받은 값을 Main Thread로 넘겨준다는 말입니다. 이에 따라 postValue() 후 즉시 getValue()를 호출했을 경우 변경된 값을 가져오지 못 할 가능성이 높습니다. 백그라운드에서 작업을 진행 중인 동시에 getValue()를 호출했기 때문입니다.
참고자료 :
https://developer.android.com/reference/androidx/lifecycle/LiveData
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
'Mobile > Android(Kotlin)' 카테고리의 다른 글
[Android] Android can make an application. so What is an Android Application Lifecycle? (0) | 2022.09.23 |
---|---|
[Android] XML 기반 View. What is View? What is View's Lifecycle? Let's Dive. (0) | 2022.09.23 |
[Android] Spinner(or RecyclerView) Custom Scrollbar. (0) | 2022.04.27 |
[Android/Kotlin] RecyclerView 구분선, 아이템 간격 Decoration (0) | 2021.11.18 |
[Android/Kotlin] Convert URL to Bitmap (2) | 2021.08.24 |