안녕하세요.
이번 포스팅의 주제는 LiveData 입니다.
안드로이 아키텍쳐 패턴(MVP, MVM, MVVM 등)에서 빠질 수 없는 것들이 몇가지 존재 하는데요.
그 중에서 저번시간에 소개드린 Databinding에 이어서 이번엔 LiveData입니다.
https://velog.io/@jojo_devstory/Android-Databinding을-알아보자
둘이 같이 쓰면 정말 찰떡궁합인데요.🥳
역시나 이 녀석도 Android JetPack 라이브러리의 하나의 기능 입니다.
한번 이 녀석이 뭐하는 녀석인지 간단하게 개념만 알아보도록 합시다.
LiveData는 Data의 변경을 관찰 할 수 있는 Data Holder 클래스 입니다.
일반적인 Observable과는 다르게 LiveData는 안드로이드 생명주기(LifeCycle)를 알고 있습니다. (Lifecycle-Aware)
즉, 액티비티나, 프레그먼트, 서비스 등과 같은 안드로이드 컴포넌트의 생명주기(Lifecycle)를 인식하며 그에따라 LiveData는 활성상태(active)일때만 데이터를 업데이트(Update) 합니다.
활성상태란 STARTED 또는 RESUMED를 의미합니다.
또한 LiveData 객체는 Observer 객체와 함께 사용됩니다. LiveData가 가지고 있는 데이터에 어떠한 변화가 일어날 경우, LiveData는 등록된 Observer 객체에 변화를 알려주고, Observer의 onChanged() 메소드가 실행되게 됩니다.
바로 LifeCycleOwner이라는 녀석이 안드로이드 생명주기 (Android LifeCycle)를 알고 있는 클래스라 보면 됩니다.
메서드가 오직 getLifeCycle() 밖에 없는 단일 메소드 인터페이스 클래스 이며, Activity나 Fragment에서 이를 상속하고 있습니다.
한 마디로 LiveData의 Observer 메소드의 LifeCycleOwner를 Activity나 Fragment를 변수로써 사용한다면 각 화면 별 생명주기에 따라 LiveData는 자신의 임무를 수행 합니다.
LiveData 객체를 사용하기 위해서는 다음 내용을 알고 계시면 됩니다.
앞에서 설명드린 것 처럼 LiveData는 주로 안드로이드 아키텍처 패턴의 ViewModel과 함께 사용되기 때문에, 예제 코드도 ViewModel을 상속받아 클래스 내에서 정의한 LiveData로 작성했습니다.
ViewModel이 무엇인지 알고 싶으시다면 이전 포스팅들을 참조 바랍니다.
예제 코드들은 Kotlin으로 작성했습니다.
class TestLiveDataViewModel : ViewModel() {
// String 타입의 MutableLiveData 생성, by lazy로 초기화는 뒤에
val textValue: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
위에서 만든 ViewModel 클래스 내의 LiveData 객체를 Activity에서 사용을 할텐데 대부분의 경우 LiveData에 Observer를 결합하는 코드는 컴포넌트의 onCreate() 메소드 내에 위치하는 것이 바람직합니다.
그 이유는 2가지가 있습니다.
class MainActivity : AppCompatActivity() {
// 전역 변수로 ViewModel lateinit 세팅
private lateinit var model: TestLiveDataViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ViewModel을 가져옵니다.
model = ViewModelProvider(this).get(TestLiveDataViewModel::class.java)
// Observer를 생성한 뒤 UI에 업데이트 시켜 줍니다.
val testObserver = Observer<String> { textValue ->
// 현재 MainActivity에는 TextView가 하나만 존재합니다.
// 다른 데이터를 받는 UI 컴포넌트가 있다면 같이 세팅 해줍니다.
tv_livedata_test.text = textValue
}
// LiveData를 Observer를 이용해 관찰하고
// 현재 Activity 및 Observer를 LifecycleOwner로 전달합니다.
model.textValue.observe(this, testObserver)
}
}
LiveData를 통해서 UI를 업데이트하는 경우 일반적으로 Activity나 Fragment 내에서 직접 선언하는 것보다 위의 예제처럼 ViewModel 내에서 정의하고 호출하여 사용하는 것이 더 좋습니다.
이유는 다들 ViewModel이 뭔지 알고 계시듯이 액티비티와 데이터 간의 결합도를 낮추고(의존성), UI Controller는 오직 data를 display만 하는 것을 수행하게 하는 안드로이드 아키텍처 패턴(디자인)을 유지하기 위해서입니다.
까놓고 말해서 LiveData는 그냥 LiveData만 쓰면 좋은점을 크게 느끼기 힘듭니다.
하지만 Databinding, ViewModel, RoomDatabase, Reactive Programing등과 함께 쓸 경우 그 진가가 발휘되며 개발자는 아주 편하게 코딩이 가능하기 때문에 UI 출력 데이터에 관한 실수 또한 줄여줍니다.
참고내용
https://developer.android.com/topic/libraries/architecture/livedata?hl=ko
https://www.charlezz.com/?p=363
https://aonee.tistory.com/entry/Android-ACC-MVVM패턴-Repository-LiveData-DataBinding-공부-후-프로젝트에-적용해보기
https://readystory.tistory.com/101