Live Data는 MVVM패턴의 구성요소인 ViewModel에서 많이 사용되는 데이터 형식입니다.
Live Data는 Android Jetpack에 포함되어 있는 라이브러리입니다.
공식문서에는 설명이 어렵게 되어 있어서 제 주관적으로 해석한 글입니다.
(제 주관이 싫다면 뒤로 가기를 살포시 눌러주셍)
우선 Live Data는 observable data holer class입니다.
쉽게 설명하면 망보는 사람
입니다.
이걸 안드로이드에서 적용해 보면 데이터가 변경되는지 감시하고 있다가
UI 컨트롤러(Activity, Fragment)들에게 알려줍니다.
그러면 UI 컨트롤러는 변경사항을 가지고 UI를 업데이트합니다.
감시자가 나는 원하지도 않는데, 계속 뭐뭐뭐 바뀌었다~ 이렇게 하면 듣는 사람들도 피곤하지 않을까요?
그래서 관찰자들은 활성상태
와 비활성상태
가 있습니다.
즉 활성상태일 때는 데이터의 변경사항을 보고 받고, 비활성상태일 때는 보고 받지 않겠다는 뜻입니다.
Live Data는 수명주기를 인식
하기에, Activity, Fragment 같은 구성요소들이 활성상태일 때만, 그들에게 업데이트를 알려줍니다.
Live Data를 사용하면 다음과 같은 이점이 있습니다.
- UI가 데이터 상태와
일치
하는지 확인할 수 있다.- LiveData는 데이터가 변경되면 Observer 객체에게 알려주고,
Observer는 알림을 받을 때마다 UI를 업데이트를 하기 때문에, 데이터와 UI 상태는 항상 일치합니다.
- LiveData는 데이터가 변경되면 Observer 객체에게 알려주고,
- 메모리 누수기 없다.
- Observer는 Activity나 Fragment의 수명 주기를 따르며, 수명 주기가 끝나면 자동으로 삭제됩니다.
따로 메모리를 해제하거나 하는 작업을 하지 않아도 됩니다.
- Observer는 Activity나 Fragment의 수명 주기를 따르며, 수명 주기가 끝나면 자동으로 삭제됩니다.
- 중지된 활동으로 인한 비정상 종료가 없다.
- Activity나 Fragment가 백 스택에 있을 때 Observer는 비활성 상태가 되며, 이때는 어떤 LiveData 이벤트도 수신받지 않는다.
- 수명 주기를 수동으로 처리하지 않음.
- UI 구성요소는 데이터를 관찰할 수 만 있고, 관찰을 중지하거나 다시 시작하지 않는다. 대신 수명 주기 상태의 변경을 인식하기 때문에 이를 통해 자동으로 관리한다.
- 최신 데이터 유지가 가능
- 수명 주기가 비활성 -> 활성으로 다시 돌아올 때 최신 데이터를 받기에, 최신 데이터를 유지할 수 있음.
- 적절한 구성 변경
- 기존 방식은 saveInstanceState를 이용해 기존 데이터를 보관해 두었다가, 화면 전환과 같은 액비티티가 재시작되면 다시 데이터를 가져와서 복원하는 방식이었지만, LiveData는 이런 복잡한 과정 없이 최신 데이터를 즉시 받을 수 있다.
- 리소스 공유
- LiveData 객체가 시스템 서비스에 한 번 연결되면 LiveData가 필요한 모든 곳에서(모든 Observer가) LiveData 객체를 관찰할 수 있다.
사용법
우선 공식문서에 있는 코드를 긁어왔다.
gradle
(쓴 시점에서 최신 버전이다)
dependencies {
val lifecycle_version = "2.5.1"
// ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version")
// LiveData
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version")
}
LiveData 객체 만들기
class NameViewModel : ViewModel() {
// 여기서 Live Data의 객체를 만든다. 예를 들면 currentSalary 등등
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
}
즉 여기서 나는 currentName라는 놈을 감시하겠다~ 이 말이다.
Observer 객체 생성
class NameActivity : AppCompatActivity() {
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//옵저버를 생산하고, 다음과 같은 작업으로 UI를 업데이트함.
val nameObserver = Observer<String> { newName ->
nameTextView.text = newName
}
//생성한 옵저버(nameObserver)를 현재 this인 NameActivity와 연결해준다. 즉 관찰자는 NameActivity가 된다.
model.currentName.observe(this, nameObserver)
}
}
즉 ViewModel은 nameTextView.text 값이 바뀔 때마다 즉각 옵서버에게 알리고,
옵서버는 UI를 업데이트한다. (nameTextView.text를 newName으로 변경함)
값이 바뀔 때마다 업데이트하기에, 추가, 삭제와 같은 작업으로 나눌 필요가 없이
옵서버에 작업들을 명시해 주면 UI관련 업데이트 코드를 한 곳에 작성할 수 있다.
더 알아보기
LiveData와 MutableLiveData
- MutableLiveData : 값의 get/set 모두 가능 -> 읽기, 쓰기 가능
- LiveData : 값의 get()만 가능 -> 읽기 가능
postValue vs setValue
- setValue : MainThread(UI)가 보장될 경우에는 set을 사용
- postValue : MainThread가 아닌 IO 스케쥴러를 활용하는 경우 PostValue를 활용
- 백그라운드에서 값을 변경
observeForever
- 기본적으로 Observer는 UI 컨트롤러의 생명주기를 인식해서 따른다.
- 액티비티가 실행되면 관찰자도 감시를 시작, 액티비티가 정지되면 관찰자도 감시를 중단하듯이 생명주기를 따른다.
- 하지만 이런 수명주기에 영향을 받지 않고 항상 알림을 받을 수 있는 방법이 바로 ObserveForever 메서드이다.
- 하지만 기존 observer는 관찰자가 종료되면 알아서 삭제되었지만,
이 메서드 경우에는 관찰자를 삭제할 경우 removeObserver 메서드를 사용해서 직접 삭제해줘야 한다.
느낀 점
- 데이터가 변경될 때마다 알림을 받아서, UI를 업데이트하는 방법은 확실히 편리하고 코드를 깔끔하게 만들어 줄 것 같다.
- 얼른 내 더러워진 코드를 LiveData 형식을 적용해서 다음에는 깔끔하게 짜는 것을 목표로 해야겠다.
- LiveData랑 Databinding을 같이 사용하던데 Databinding에 대해서도 공부를 해야겠다.
'Skils > Android' 카테고리의 다른 글
[Android] - Navigation Component (0) | 2023.09.03 |
---|---|
[Android] - Context (0) | 2023.02.22 |
[Android] - ViewModel (0) | 2023.02.09 |
[Android] - 안드로이드 설계 패턴(MVP) (0) | 2023.02.05 |
[Android] - 안드로이드 설계 패턴 (MVC) (0) | 2023.02.04 |