이전 게시글에서 소개한 MVVM 아키텍처 패턴을 더 공부하기 위해선 ViewModel과 LiveData 에 대해 자세하게 알아야 한다.
이 포스팅에서는 LiveData에 대해 다루기로 하였다.
LiveData는 JetPack
라이브러리의 구성요소 중 하나이다.
Jetpack 은 개발자가 관심 있는 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 제거, 모든 Android 버전과 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음
LiveData는 일반 클래스와 다르게 Lifecycle를 인식할 수 있는 클래스이다.
Activity와 Fragment의 LifeCycle을 인식하여 현재 활성화가 되어있는 관찰자만 업데이트하게 된다.
그렇기 때문에, LifeCycle이 종료되면 같이 사라지기 때문에 메모리 누출이 없는 장점이 있다.
또한, Observe 패턴 을 따르기 때문에 데이터가 변경될 때 활성화가 되어있는 관찰자가 UI를 업데이트 해주므로 개발자가 데이터를 업데이트할 필요가 없다
Observe Pattern은 데이터를 발행하는 발행자(Observable)와 데이터를 구독하는 구독자(Observe)로 나누어 진다.
그림에서는 왼쪽에 있는 Subject가 발행자이고, 오른쪽에 있는 얘들이 구독자이다.
만약 IT정보를 보내주는 메일 서비스를 구독하게 되면 IT정보가 업데이트 될 때마다 메일로 나에게 알려주게 될 것이다. 여기서 메일 서비스는 발행자가 될 것이고, 메일 서비스를 수신하는 나는 구독자가 될 것이다.
LiveData는 데이터를 발행시키는 발행자인 observable로 LiveData를 구독, 즉 Observe(관찰)하는 객체들에게 데이터를 실시간으로 제공한다.
안드로이드에서는 아무에게나 LiveData를 업데이트 시켜주지 않는다. 위에서 말한 Activity와 Fragment의 LifeCycler에 따라 활성화되고, 종료된다.
🤔 그럼!! 어떻게 LiveData는 lifeCycle을 알 수 있을까?! -> 바로 LifecycleOwner
인터페이스때문에 가능하다.
LifecycleOwner 인터페이스는 Activity나 Fragment의 LifeCycle을 알고 있고 그거를 알려준다.
STARTED
or RESUME
-> 관찰자 활성DESTROYED
-> 관찰자 삭제숫자를 입력하고, 더하기 또는 빼기 버튼을 눌렀을 때 값이 더해지거나 빼지는 앱이 있다고 가정하자.
LiveData는 Collections
에 있는 모든 데이터와 함께 사용할 수 있다.
일반적으로 ViewModel
객체 내에 저장된다.
private val _currentValue = MutableLiveData<Int>()
val currentValue : LiveData<Int>
get() = _currentValue
클래스 내부에서 변경되는 데이터를 가지고 있는 MutableLiveData
와
클래스 외부에서 읽기 전용으로 사용되는 LiveData
를 만들어 준다.
LivaData 객체 관찰을 시작하기에 적합한 메서드는 onCreate()
이다. Observe 객체는 대부분 Activity나 Fragment와 같은 UI 컨트롤러
에 일반적으로 존재한다.
myViewModel.currentValue.observe(this, Observer {
// it : LiveData의 Value 값
Log.d("로그"," currentLiveData value change : $it")
tvNumber.text = it.toString()
})
observe()
메서드의 첫번째 매개변수는 LifeCycleOwner인 MainActivity이다.
두번째 매개변수는 Observe는 LiveData의 value 변경을 감지하는 부분이다.
fun updateValue(actionType: ActionType, input : Int){
when(actionType){
ActionType.PLUS ->
_currentValue.value = _currentValue.value?.plus(input)
ActionType.MINUS ->
_currentValue.value = _currentValue.value?.minus(input)
}
}
ViewModel 내부에 이벤트가 발생했을때 호출될 메서드를 선언시킨다.
매개변수로는 더하기인지 마이너스인지 구분할 type과 더하고자 하는 값을 전달받는다.
btnPlus.setOnClickListener {
myViewModel.updateValue(ActionType.PLUS, userInput)
}
UI 컨트롤러에서 바로 LiveData 객체의 값을 업데이트 하기 위해선 setValue
또는 postValue
도 사용할 수 있다.
버튼을 눌렀을 때 MyViewModel의 updateValue를 호출시켜 LiveData를 업데이트 시킨다.
이벤트가 발생하면, 활성화 상태인 관찰자들이 모두 보고있는 LiveData 값이 업데이트된다.
LiveData는 RoomDataBase,코루틴,ViewModel 등등과 함께 사용되며, 여러 LiveData를 병합할 수도 있고 확장, 변환도 가능하다.
다음에는 LiveData가 구현되는 ViewModel에 대해서 알아 볼 것이다.
자료 잘봤어요! 지금은 졸업하고 취준중이신가여?