LiveData
LiveData
LiveData는 안드로이드 Jetpack 아키텍처 컴포넌트(Architecture Components)에서 제공하는 관찰 가능한 데이터 홀더(observable data holder) 클래스입니다. 생명주기 인식(lifecycle-aware) 기능을 갖추고 있어, STARTED 또는 RESUMED처럼 활성 상태에 있는 옵저버에게만 데이터 업데이트를 전달합니다. 덕분에 이미 파괴된 UI 컴포넌트를 업데이트하려다 발생하는 크래시나 메모리 누수를 방지할 수 있습니다. LiveData는 안드로이드 MVVM 아키텍처의 핵심 요소로 오랫동안 사용되어 왔으며, 동작 원리와 한계점, 그리고 Flow와 같은 최신 대안과의 관계는 면접에서 자주 다루어지는 주제이기도 합니다.
이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.
LiveData의 생명주기 인식 기능이 비활성 옵저버에 대한 업데이트를 어떻게 방지하는지 설명할 수 있습니다.MutableLiveData와LiveData의 캡슐화 관점에서의 차이점을 이해할 수 있습니다.setValue()와postValue()의 스레딩 동작 방식을 파악할 수 있습니다.LiveData가 적합한 상황과Flow기반 대안이 더 나은 상황을 구분할 수 있습니다.
생명주기 인식과 옵저버 관리
LiveData는 안드로이드의 LifecycleOwner 인터페이스와 통합되어 동작합니다. observe()를 호출할 때 LifecycleOwner와 Observer를 함께 전달하면, LiveData는 내부적으로 LifecycleBoundObserver를 등록하여 해당 소유자의 생명주기 상태를 감시합니다.
viewModel.data.observe(viewLifecycleOwner) { value ->
textView.text = value
}
옵저버는 LifecycleOwner가 STARTED 또는 RESUMED 상태에 있을 때만 업데이트를 수신합니다. 소유자가 DESTROYED 상태로 전환되면, LiveData는 자동으로 옵저버를 제거합니다. 이 메커니즘 덕분에 onDestroy()나 onDestroyView()에서 수동으로 정리 작업을 할 필요가 없으며, Fragment나 Activity가 이미 파괴된 후에 뷰를 업데이트하려는 흔한 버그도 원천적으로 방지할 수 있습니다.
또한 LiveData는 옵저버가 비활성 상태에서 활성 상태로 전환될 때 가장 최신 값을 자동으로 전달합니다. 가령 구성 변경(configuration change) 중에 데이터가 변경되었더라도, 옵저버가 다시 활성 상태가 되는 순간 현재 값을 즉시 수신하게 됩니다. 이러한 특성 덕분에 화면 회전 등의 구성 변경 시에도 별도의 데이터 재요청 없이 UI 상태를 자연스럽게 복원할 수 있습니다.
MutableLiveData와 LiveData의 차이
MutableLiveData는 보유한 값을 업데이트할 수 있도록 setValue()와 postValue() 메서드를 외부에 노출합니다. 반면 LiveData 자체는 읽기 전용이며 값을 변경하는 메서드를 노출하지 않습니다. 일반적인 패턴은 ViewModel 내부에서 MutableLiveData를 private으로 유지하고, UI 레이어에는 LiveData 타입으로만 노출하는 것입니다.
class MyViewModel : ViewModel() {
// 외부에서 직접 수정할 수 없도록 private으로 선언
private val _state = MutableLiveData<String>()
// UI 레이어에서는 읽기 전용 LiveData로만 접근 가능
val state: LiveData<String> get() = _state
fun updateState(value: String) {
_state.value = value
}
}
이러한 캡슐화를 통해 ViewModel만 데이터를 수정할 수 있고, UI 레이어에서는 관찰만 가능하도록 보장합니다. 밑줄(_) 접두사를 사용하는 backing field 패턴은 안드로이드 개발에서 널리 채택된 관행이며, 면접에서도 이 패턴의 목적과 이점을 명확히 설명하실 수 있으면 좋습니다.