ViewModel & LiveData
*๊ณต์๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.*
Activity ๋๋ Fragment๋ฅผ UI ์ปจํธ๋กค๋ฌ๋ผ๊ณ ํ๋ค.
UI ์ปจํธ๋กค๋ฌ์ ๋ชฉ์ ์ UI ๋ฐ์ดํฐ ํ์, ์ฌ์ฉ์ ์์ ์ ๋ฐ์, ๊ถํ ์์ฒญ ๋ฑ์ด ์๋ค.
์์คํ ์์ UI ์ปจํธ๋กค๋ฌ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ค์ ๋ง๋๋ ๊ฒฝ์ฐ ์ ์ฅ๋ ๋ชจ๋ UI ๊ด๋ จ ๋ฐ์ดํฐ๋ ์ญ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ์ ๋ณด๊ฐ ํฌํจ๋์ด์๋ Activity๊ฐ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋์ด ๋ค์ ์์ฑ๋๋ค๋ฉด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ค์ ๊ฐ์ ธ์์ผํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ UI ์ปจํธ๋กค๋ฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ํจ์ฌ ํจ์จ์ ์ด๋ค.
UI ์ปจํธ๋กค๋ฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ๋นํจ์จ์ ์ธ ์ด์
- UI ์ปจํธ๋กค๋ฌ๊ฐ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ ๋น๋๊ธฐ ํธ์ถ์ ์์ฃผ ํด์ผํ๋ค.
- UI ์ปจํธ๋กค๋ฌ๊ฐ ๋น๋๊ธฐ ํธ์ถ์ ๊ด๋ฆฌํด์ผํ๋๋ฐ ์ด๋ ๋ง์ ์ ์ง๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.
- ๊ฐ์ฒด๊ฐ ๋ค์ ์์ฑ๋๋ ๊ฒฝ์ฐ ์ด๋ฏธ ์ํ๋ ํธ์ถ์ ๋ค์ ํธ์ถํด์ผํ๋ฏ๋ก ๋ฆฌ์์ค๊ฐ ๋ญ๋น๋๋ค.
- UI ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ดํฐ ๋ก๋๋ฅผ ์ฑ ์์ง๋๋ก ์๊ตฌํ์ฌ ํด๋์ค๊ฐ ํฝ์ฐฝ๋๋ค.
- UI ์ปจํธ๋กค๋ฌ์ ๊ณผ๋ํ ์ฑ ์์ ํ ๋นํ์ฌ ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋ค.
๋ฐ๋ผ์ UI ์ปจํธ๋กค๋ฌ์์๋ ๋ฐ์ดํฐ๋ฅผ ํ์๋ง ํ๊ณ ๋ค๋ฅธ ํด๋์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด ๊ฐ์ฅ ์ ํฉํ๋ค.
์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ํด๋์ค์ ๋ํ์ ์ธ ์๊ฐ ViewModel์ด๋ค.
ViewModel
ViewModel์ UI ์ปจํธ๋กค๋ฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํด๋์ค์ด๋ค.
ViewModel์ ์ ์ผํ ๋ชฉ์ ์ UI ์ปจํธ๋กค๋ฌ์ ํ์ํ ์ ๋ณด๋ฅผ ํ๋ํ๊ณ ์ ์งํ๋ ๊ฒ์ด๋ค.
ViewModel์ ์๋ช ์ฃผ๊ธฐ
ViewModel์ Activity๊ฐ ๋๋ ๋๊น์ง, Fragment๊ฐ ๋ถ๋ฆฌ๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋๋ค.
์ ๊ทธ๋ฆผ์ ํ๋ฉด์ ํ์ ํ์ ๋์ Activity ์๋ช ์ฃผ๊ธฐ์ ViewModel์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ณด์ฌ์ค๋ค.
Activity์ ์๋ช ์ฃผ๊ธฐ๋ ํ๋ฉด์ ํ์ ํ์ ๋ ๋ค์ ์์ํ๋ค.
๊ทธ๋ฌ๋ ViewModel์ ์๋ช ์ฃผ๊ธฐ๋ onCreate()๋ฅผ ํธ์ถํ์ ๋ ์์ฑ๋๊ณ
Acitivty๊ฐ ์ค๊ฐ์ ์ด๋ค ํ๋์ ํ๋ ์๊ด์์ด Acitivty์ ๋ชจ๋ ํ๋์ด ๋๋๊ณ ํ๊ธฐ๋ ๋๊น์ง ๋จ์์๋๋ค.
์ฆ, Activity๊ฐ onDestroy()๋๋๋ผ๋ ViewModel์ destroyed ๋์ง ์๋๋ค.
ViewModel์ ํน์ง
- UI ์ปจํธ๋กค๋ฌ๊ฐ ๋๋๊ณ ํ๊ธฐ๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋๋ค.
- ViewModel์ ์๋ช ์ฃผ๊ธฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ด์ฐฐํด์๋ ์๋๋ค.
- UI ์ปจํธ๋กค๋ฌ๋ ViewModel์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด์ฐฐํ ์ ์์ด์ผํ๋ค.
- ViewModel์ ์ผ๋ฐ์ ์ผ๋ก LiveData ๋๋ DataBinding์ ํตํด ์ ๋ณด๋ฅผ ๋ ธ์ถํ๋ค.
ViewModel์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ฉด
UI ์ปจํธ๋กค๋ฌ๋ฅผ ์คํํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ๊ด์ฐฐํ ์ ์๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ ์ฉ์ดํ๋ค.
LiveData
LiveData๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํ๋ ํด๋์ค์ด๋ค.
์ผ๋ฐ ํด๋์ค์๋ ๋ฌ๋ฆฌ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ธ์ํ์ฌ ํ์ฑ ์ํ์ ์๋ ๊ตฌ์ฑ์์ Observer๋ง ์ ๋ฐ์ดํธํ๋ค.
์ฆ, Observer ํด๋์ค๋ก ํํ๋๋ ๊ด์ฐฐ์์ ์๋ช ์ฃผ๊ธฐ๊ฐ
started ๋๋ resumed ์ํ์ด๋ฉด ํ์ฑ ์ํ๋ก ๊ฐ์ฃผํ์ฌ ์ ๋ฐ์ดํธ ์ ๋ณด๋ฅผ ์๋ฆฌ๊ณ
destroyed๋ก ๋ณ๊ฒฝ๋ ๋ ๊ด์ฐฐ์๋ฅผ ์ญ์ ํ๋ค.
UI ์ปจํธ๋กค๋ฌ๋ ๋ฐ์ดํฐ ์ํ ๋ณด์ ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ์ญํ ์ด๋ฏ๋ก LiveData๋ฅผ ๋ณด์ ํด์๋ ์๋๋ค.
UI ์ปจํธ๋กค๋ฌ๋ LiveData ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ๊ด์ฐฐํ ์ ์๊ณ
์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋๋ ์ฆ์ ์์ ๊ฑฐ๋ถ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๊ฑฑ์ ํ์ง ์์๋ ๋๋ค.
LIveData์ ์ด์
- ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์๋์ผ๋ก Observer๊ฐ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ก ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ค.
- ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋๋ฉด ์๋์ผ๋ก ์ญ์ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๋ค.
- ์๋ช ์ฃผ๊ธฐ๊ฐ ๋นํ์ฑ ์ํ์ ์์ผ๋ฉด LiveData ์ด๋ฒคํธ๋ฅผ ๋ฐ์ง ์์ผ๋ฏ๋ก ์ค์ง๋ ํ๋์ผ๋ก ์ธํ ๋น์ ์ ์ข ๋ฃ๊ฐ ์๋ค.
- UI ๊ตฌ์ฑ์์๋ ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ๊ธฐ๋ง ํ๊ณ LiveData๋ ์๋ช ์ฃผ๊ธฐ ์ํ ๋ณ๊ฒฝ์ ์ธ์ํ๋ฏ๋ก ์๋ช ์ฃผ๊ธฐ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค.
- ๋นํ์ฑํ๋ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋ค์ ํ์ฑํ๋ ๋ ์๋์ผ๋ก ์ต์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ฌ ์ต์ ๋ฐ์ดํฐ ์ ์ง๊ฐ ๊ฐ๋ฅํ๋ค.
- ๊ธฐ๊ธฐ ํ์ ๊ณผ ๊ฐ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ธํด UI ์ปจํธ๋กค๋ฌ๊ฐ ๋ค์ ์์ฑ๋๋ฉด ์๋์ผ๋ก ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ๋ฐ๋๋ค.
- LiveData๊ฐ ์์คํ ์ ํ๋ฒ ์ฐ๊ฒฐ๋๋ฉด ๋ชจ๋ ๊ด์ฐฐ์๊ฐ LiveData ๊ฐ์ฒด๋ฅผ ๋ณผ ์ ์์ผ๋ฏ๋ก ๋ฆฌ์์ค ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค.
ViewModel์ UI ์ปจํธ๋กค๋ฌ๊ฐ ํ๊ดด๋ ๋๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ณ
๋ฐ์ดํฐ๋ LiveData๋ก ํํ๋์ด ์๋ช
์ฃผ๊ธฐ์ ๋ฐ๋ผ UI ์ปจํธ๋กค๋ฌ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์
๋ฉ๋ชจ๋ฆฌ ๋์ ์์ด ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
ViewModel & LiveData ์ฌ์ฉํ๊ธฐ
ViewModel, LiveData ๊ฐ์ฒด ๋ง๋ค๊ธฐ
1. ViewModel ํด๋์ค ๋ด์์ LiveData ์ธ์คํด์ค ์์ฑํ๋ค.
class NameViewModel : ViewModel() {
// 1. ViewModel ํด๋์ค ๋ด์์ LiveData ์ธ์คํด์ค ์์ฑ
val name : MutableLiveData<String> by lazy {
MutableLiveData<String>
}
}
LiveData ๊ฐ์ฒด ๊ด์ฐฐํ๊ธฐ
1. Observer ๊ฐ์ฒด ์์ฑ ํ onChanged() ๋ฉ์๋๋ฅผ ์ ์ํ๋ค.
onChanged() ๋ฉ์๋๋ LiveData๊ฐ ๋ณด์ ํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ฐ์ํ๋ ์์ ์ ์ ์ดํ๋ค.
์ผ๋ฐ์ ์ผ๋ก UI ์ปจํธ๋กค๋ฌ์ Observer ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
2. observe() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ LiveData์ Observer ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ค.
observer() ๋ฉ์๋๋ LifechcleOwner ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
Observer ๊ฐ์ฒด๊ฐ LiveData ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ฌํญ์ ๊ดํ ์๋ฆผ์ ๋ฐ์ ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก UI ์ปจํธ๋กค๋ฌ์ Observer ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ค.
class NameActivity : AppCompatActivity() {
private val model : NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. Observer ๊ฐ์ฒด ์์ฑ
val observer = Observer<String> { newName ->
// 1. onChanged() ๋ฉ์๋ ์ ์
nameTextView.text = newName
}
// 2. observer ๋ฉ์๋ ์ฌ์ฉํ์ฌ LiveData์ Observer ์ฐ๊ฒฐ
model.name.observe(this, observer)
}
}
* onCreate() ๋ฉ์๋๋ LiveData ๊ฐ์ฒด ๊ด์ฐฐ์ ์์ํ๊ธฐ ์ ํฉํ ์ฅ์์ด๋ค.
- ์์คํ ์ด UI ์ปจํธ๋กค๋ฌ์ onResume() ๋ฉ์๋์ ์ค๋ณต ํธ์ถ์ ํ์ง ์๋๋ก ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- UI ์ปจํธ๋กค๋ฌ๊ฐ ํ์ฑ ์ํ ๋๋ ์ฆ์ ํ์ํ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋๋ก ํ๊ธฐ ์ํจ์ด๋ค.
LiveData ๊ฐ์ฒด ์ ๋ฐ์ดํธํ๊ธฐ
LiveData์๋ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ ์๋ค.
MutableLiveData ํด๋์ค ์ฌ์ฉ ์ ์ธ ์ ์๋ ๋ฉ์๋ setValue(T), postValue(T)์ T ๊ฐ๊ณผ ํจ๊ป onChanged() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
model.name.setValue("change")
ViewModel์ ์ฌ์ฉํ์ฌ Fragment ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ํ๊ธฐ
Fragment1์ select ํจ์๋ฅผ ํตํด seleted๋ฅผ ์ ๋ฐ์ดํธํ๊ณ
Fragment2๋ selected๋ฅผ ํตํด ๊ฐ์ ์ ๋ฌ๋ฐ๋๋ค.
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Item>()
fun select(item: Item) {
selected.value = item
}
}
Room์์ LiveData ์ฌ์ฉํ๊ธฐ
Room์ ๊ด์ฐฐ ๊ฐ๋ฅํ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋ฉด LiveData ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๊ด์ฐฐ ๊ฐ๋ฅํ ์ฟผ๋ฆฌ๋ DAO(Database Access Object)์ ์ผ๋ถ๋ก ์์ฑํ๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๋ฐ์ดํธ๋ ๋ Room์์๋ LiveData ๊ฐ์ฒด๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
UI์ ํ์๋ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๊ฐ์ ๋๊ธฐํ๋ฅผ ์ ์งํ๋๋ฐ ์ ์ฉํ๋ค.
Room์ ๋ํด์๋ ๋ค๋ฅธ ํฌ์คํ ์์ ์์ธํ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
'๐ป๊ฐ๋ฐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MVC, MVP, MVVM ๊ฐ๋จ ์ ๋ฆฌ (0) | 2021.09.07 |
---|---|
์๋๋ก ๋น๊ฒจ ์๋ก๊ณ ์นจ : SwipeRefreshLayout (0) | 2021.09.02 |
[์ค๋ฅํด๊ฒฐ] Runtime JAR files in the classpath should have the same version. These files were found in the classpath: (0) | 2021.08.26 |
Koin Setup : ์ฝ์ธ ์ ์ ํ๊ธฐ (0) | 2021.08.26 |
coroutines Setup : ์ฝ๋ฃจํด ์ ์ ํ๊ธฐ (0) | 2021.08.26 |