LiveData ๋?
LiveData๋ Data์ ๋ณ๊ฒฝ์ ๊ด์ฐฐํ ์์๋ Data Holder ํด๋์ค์ด๋ค.
LiveData๋ ์๋๋ก์ด๋ ์๋ช ์ฃผ๊ธฐ(LifeCycle)์ ์๊ณ ์๋ค.
์ฆ, Activity, Frgment, Service ๋ฑ๊ณผ ๊ฐ์ ์๋๋ก์ด๋ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ(Lifecycle)๋ฅผ ์ธ์ํ๋ฉฐ ๊ทธ์ ๋ฐ๋ผ LiveData๋ ํ์ฑ ์ํ์ผ ๋๋ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค. ํ์ฑ ์ํ๋ Started ๋๋ Resumed๋ฅผ ์๋ฏธํ๋ค. ๋นํ๋ ์ํ์ผ ๋, LiveData๋ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ์๋ฆฌ์ง ์๋ค. Destoryed ๋ ์ํ์ lifecycle ์์๋ LiveData ๊ฐ์ฒด๋ฅผ Observeํ์ง ์๋๋ค.
LiveData ๊ฐ์ฒด๋ Observer ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉ๋๋ค. LiveData๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ, LiveData๋ ๋ฑ๋ก๋ Observer ๊ฐ์ฒด์ ๋ณํ๋ฅผ ์๋ ค์ฃผ๊ณ , Observer์ onChanged()๋ฉ์๋๊ฐ ์คํ๋๊ฒ ๋๋ค.
LiveData๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ด๋ป๊ฒ ์๊น?
LifeCycleOwner๊ฐ ์๋๋ก์ด๋ ์๋ช
์ฃผ๊ธฐ(Android LifeCycle)์ ์๊ณ ์๋ ํด๋์ค๋ค.
LifeCycleOwner๋ getLifeCycle() ๋ฉ์๋๋ง ๊ฐ์ง๊ณ ์๋ ๋จ์ผ ์ธํฐํ์ด์ค ํด๋์ค์ด๋ฉฐ Activity๋ Fragment์์ ์์ํ๊ณ ์๋ค.
์ฆ, LiveData์ Observer ๋ฉ์๋์ LifeCycleOwner๋ฅผ Activity๋ Fragment์ ๋ณ์๋ก ์ฌ์ฉํ๋ค๋ฉด ๊ฐ ํ๋ฉด์ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
์ฅ์
UI์ Data์ ์ํ ์ผ์น
Ensures your UI matches your data state
LiveData๋ Observer ํจํด์ ๋ฐ๋ฅธ๋ค.
LiveData๋ ์๋๋ก์ด๋ ์๋ช
์ฃผ๊ธฐ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ง๋ค Observer ๊ฐ์ฒด์ ์๋ ค์ค๋ค.
์ฆ, Observer ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์ผ์ด๋๋ ๊ณณ๋ง๋ค ๋งค๋ฒ UI๋ฅผ ์
๋ฐ์ดํธํ๋ ์ฝ๋๋ฅผ ์์ฑํ ํ์ ์์ด ํตํฉ์ ์ด๊ณ ํ์คํ๊ฒ ๋ฐ์ดํฐ์ ์ํ์ UI๋ฅผ ์ผ์น์ํฌ ์ ์์ต๋๋ค.
๋ฉ๋ชจ์ฅ ์์
๋ฉ๋ชจ์ฅ ์ฑ์์ ๋ฉ๋ชจ ๋ฆฌ์คํธ๋ฅผ ๋ณผ ์ ์๋ ํ๋ฉด์ ๊ตฌ์ฑํ๋ค๊ณ ๊ฐ์ ํ ๋
์ฌ์ฉ์๊ฐ ์์ ์ ๋ฉ๋ชจ์ฅ ์ ๋ชฉ์ ์์ ํ๊ฒ ๋๋ค๋ฉด,
1. DB์์ ํด๋น ๋ฉ๋ชจ์ ์ ๋ชฉ์ ์๋ก ๊ฐฑ์ ํ๋ค.
2. DB์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ฉ๋ชจ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํ๋ฉด์ ๋ฟ๋ ค์ค์ผ ํ๋ค.
LiveData๋ DB์ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๊ฐฑ์ ํ๋ฉด ๋ฐ์ดํฐ์ ๋ณํ(Observer ๊ฐ์ฒด์ ๋ฐ์ดํฐ ๋ณํ)๋ฅผ ๊ฐ์งํ๊ณ ์๋์ผ๋ก list์ ๊ธ ์ ๋ชฉ์ ๊ฐฑ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ 2๋ฒ ๊ณผ์ ์ ์๋ตํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ๋ชจ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ถ๊ฐํ์ ๋, ๋ฉ๋ชจ ์ ๋ชฉ์ ์กฐํํ์ฌ list์ ์๋กญ๊ฒ ๋ฟ๋ ค์ฃผ๋ ์ฝ๋๋ฅผ ์ฐ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๊ณ ์ ์ง ๋ณด์ํ ๋, ์ ๊ฒฝ์ธ ๋ถ๋ถ์ด ์ค์ด๋ ๋ค.
๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
No memory leaks
Observer ๊ฐ์ฒด๋ ์๋๋ก์ด๋ ์๋ช
์ฃผ๊ธฐ ๊ฐ์ฒด์ ๊ฒฐํฉ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ๊ฐ Destroy ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์์์ ์ค์ค๋ก ํด์ ํ๋ค.
์ฆ, Activity ๋ Fragment ์ lifecylce์ด Destroyed ๋๋ฉด Observers๊ฐ clean up ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ํจ๊ณผ์ ์ด๋ค.
๋ฉ์ถ ์กํฐ๋นํฐ์ ์ถฉ๋ ๋ฐฉ์ง
No crashes due to stopped activities
Lifecycle ์ค์ inactive (onStop, onDestroy) ๋ activity ๊ฐ ์๋ค๋ฉด LiveData๋ ์ด๋ค ์ด๋ฒคํธ๋ ๋ฐ์ง ์๋๋ค.
์ฆ, ์กํฐ๋นํฐ๊ฐ Back Stack์ ์๋ ๊ฒ์ฒ๋ผ Observer์ ์๋ช
์ฃผ๊ธฐ๊ฐ inactive(๋นํ์ฑํ) ์ผ ๊ฒฝ์ฐ, Observer๋ LiveData์ ์ด๋ค ์ด๋ฒคํธ๋ ์์ ํ์ง ์๋๋ค.
์๋ช ์ฃผ๊ธฐ์ ๋ํ ์ถ๊ฐ์ ์ธ handling์ ํ์ง ์์๋ ๋๋ค.
No more manual lifecycle handling
LiveData๋ ์๋ช ์ฃผ๊ธฐ๋ณ๋ก ์๋์ผ๋ก <UI component๊ฐ ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ์ธ์งํ๊ณ ๊ฐฑ์ ํ๋ ๊ฒ>์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ง์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๋ค.
์ต์ ๋ฐ์ดํฐ ์ ์ง
ํ๋ฉด ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ค.
์๋ฅผ ๋ค์ด, ๋๋ฐ์ด์ค๋ฅผ ํ์ ํ์ฌ ์ธ๋ก์์ ๊ฐ๋ก๋ก ํ๋ฉด์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ์๋ LiveData๋ ํ์ ํ๊ธฐ ์ ์ ์ต์ ์ํ๋ฅผ ์ฆ์ ๋ฐ์์จ๋ค.
์ง์(Resource) ๊ณต์
์์(Resource)๋ฅผ ๊ณต์ ํ ์ ์๋ค.
LiveData๋ฅผ ์์ํ์ฌ ์์ ๋ง์ LiveDataํด๋์ค๋ฅผ ๊ตฌํํ ์ ์๊ณ ์ฑ๊ธํค ํจํด์ ์ด์ฉํ์ฌ ์์คํ
์๋น์ค๋ฅผ ๋๋ฌ์ธ๋ฉด(Wrap) ์ฑ ์ด๋์์๋ ์์์ ๊ณต์ ํ ์ ์๋ค.
์ฌ์ฉ์ ์ฃผ์ํ ์
๋ค์์ ์์ฑ ์์
์์ ์ฝ๋
๋ฒํผ์ ๋๋ฌ ์ซ์๋ฅผ ์ฆ๊ฐํ๋ ์ฑ ์์
MainActivity.kt
class MainActivity : AppCompatActivity() {
// ์ ์ญ ๋ณ์๋ก ViewModel lateinit ์ธํ
private lateinit var viewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel์ ๊ฐ์ ธ์จ๋ค
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
findViewById<Button>(R.id.btnArea).setOnClickListener {
// ์นด์ดํธ ์ฆ๊ฐ
viewModel.plusLiveDataValue()
}
// LiveData๋ฅผ Observer๋ฅผ ์ด์ฉํด ๊ด์ฐฐํ๊ณ
// ํ์ฌ Activity ๋ฐ Observer๋ฅผ LifecycleOwner๋ก ์ ๋ฌํ๋ค.
viewModel.testMutableLiveData.observe(this, Observer {
// ๋ณํ๊ฐ ์์ ๋ UI(์ฌ๊ธฐ์ TextView)๋ฅผ ์
๋ฐ์ดํธ ์์ผ์ค๋ค.
findViewById<TextView>(R.id.textArea).text = viewModel.testMutableLiveData.value.toString()
})
}
}
MainViewModel.kt
class MainViewModel : ViewModel() {
// LiveData์ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
var testMutableLiveData = MutableLiveData(0)
fun plusLiveDataValue(){
// LiveData์ ๊ฐ 1 ์ฆ๊ฐ
testMutableLiveData.value = testMutableLiveData.value!!.plus(1)
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textArea"
android:textSize="60dp"
android:text="0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnArea"
android:text="btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
์ฐธ๊ณ
https://velog.io/@jojo_devstory/Android-LiveData...%EB%84%8C-%EB%88%84%EA%B5%AC%EB%83%90
https://velog.io/@shin_stealer/LiveData-%EB%9E%80
https://developer.android.com/topic/libraries/architecture/livedata?authuser=1
'๐ Development > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java ์๋ฐ, Android ์๋๋ก์ด๋] ์ฑํ ๋ฐฉ ๋ง๋ค๊ธฐ (0) | 2023.07.17 |
---|---|
[์๋๋ก์ด๋] Jetpack์ ViewModel์ด๋? (์ฌ์ฉ๋ฒ ์์ ) (0) | 2023.05.22 |
[์๋๋ก์ด๋] Jetpack์ Room DB์ด๋? (์ฌ์ฉ๋ฒ ์์ ) (0) | 2023.05.17 |
[์๋๋ก์ด๋] Local DB SQLite ์ด๋? (์ฌ์ฉ๋ฒ ์์ ) (0) | 2023.05.17 |
[์๋๋ก์ด๋] Retrofit2 ๋? (์ฌ์ฉ๋ฒ ์์ ) (1) | 2023.05.16 |