다이어리 앱 만들기를 하면서 가장 어려웠던게 뭐에요? 라고 물어보면 진짜 무조건 "UI 상태 관리요;;" 라고 할 것이다. 스프링만 했던 나에게 상태관리란 참 낯선 존재.. 그리고 뭐 어케 작동하는지 알 수 있어야지😅
그래서 시간이 남은 김에 한번 UI 상태관리와 관련해서 공식문서를 찾아보고 정리를 해보려고 한다. 처음은 바로 Live Data..!!
한번 공부해보겠습미다.. 레쮸꼬~~🫣
모든 글은 노션에 개인적으로 공부한 글을 다시 업로드 하는거라 이상할 수 있습니다!! 그냥 코틀린 공부하는 입문자가 혼자 쓰는 블로그구나 생각해주세요!! 오류 사항이나 수정 사항은 알려주시면 저에게 큰 도움이 됩니다🌈
Observer
들에게 알림을 보냄으로써 동작한다.Observer
는 Lifecycle
에 결합되어 있으며 연결된 수명 주기가 끝나면 자동 삭제됨liveData
이벤트도 받지 않는다.acitivity
나 fragment
가 다시 생성되면 사용 가능한 최신 데이터를 즉시 다시 받음[LiveData](https://developer.android.com/reference/androidx/lifecycle/LiveData?hl=ko)
객체를 확장하여 시스템 서비스를 래핑할 수 있다. LiveData
객체가 시스템 서비스에 한 번 연결되면 리소스가 필요한 모든 관찰자가 LiveData
객체를 볼 수 있다. 자세한 내용은 LiveData 확장을 참고LiveData 인스턴스 생성 → viewModel 클래스 내
class UserViewModel : ViewModel() {
// LiveData 초기화 - 읽기 전용 데이터
val userName: LiveData<String> = MutableLiveData("John Doe")
// MutableLiveData 초기화 - 값 변경 가능
private val _userName2 = MutableLiveData("John Doe")
val userName2: LiveData<String> = _userName2
// userName 값을 업데이트하는 함수
fun updateUserName(newName: String) {
_userName2.value = newName
}
lazy
: 실제로 getCurrentName
이 사용되는 시점까지 객체 생성을 지연시켜 초기 리소스 소모를 최소화 한다.MutableLiveData<String>()
의 인스턴스가 생성되고, 그 이후로는 같은 인스턴스를 재사용Observer 객체 생성 - onChanged()메서드를 정의 : LiveData가 보유한 데이터 변경시 발생하는 작업 제어 → Activity, Fragment 내
Observe() 메서드를 활용해 LiveData에 Observer 객체 연결
observe() 메서드는 LifeCycleOwner 객체를 활용함
1. observe(LifecycleOwner, Observer)
LiveData
에 변경 사항이 있을 때마다 실행될 코드 블록(Observer
)을 정의한다. LifecycleOwner
(예: 액티비티나 프래그먼트)는 관찰자가 관찰을 시작하고 중단해야 하는 시점을 결정하는 데 사용된다. 이 메서드를 사용하면 LiveData
의 변경 사항을 안전하게 관찰하고, LifecycleOwner
의 생명주기에 따라 자동으로 관찰을 중지하여 메모리 누수를 방지할 수 있다.2. observeForever(Observer)
LifecycleOwner
없이 LiveData
를 관찰할 때 사용한다. 이 방법은 LiveData
의 변경 사항을 생명주기와 무관하게 계속해서 관찰하고 싶을 때 유용하다. 그러나 observeForever
로 등록된 관찰자는 수동으로 제거(removeObserver
)해야 하며, 그렇지 않으면 메모리 누수가 발생할 위험이 있다!3. observeAsState()
(Jetpack Compose용)
LiveData
를 Compose의 State
객체로 변환한다. 이를 통해 Composable 함수 내에서 LiveData
의 최신 값을 쉽게 읽을 수 있으며, LiveData
의 데이터가 변경될 때 자동으로 UI를 재구성(리컴포지션)한다.val selectedDate by viewModel.selectedDate.observeAsState(LocalDateTime.now())
remember
나 derivedStateOf
같은 Compose 유틸리티를 사용하여 재구성을 최적화할 수 있다.4. hasActiveObservers()
LiveData
객체에 활성 상태의 관찰자(Observer)가 있는지 여부를 확인LiveData
가 관찰자에 의해 관찰되고 있는지 여부를 알고 싶을 때 유용하며, 주로 디버깅이나 특정 로직의 조건으로 사용될 수 있다