LiveData๋?
LiveData๊ฐ ๊ฐ๊ณ ์๋ ๋ฐ์ดํฐ์ ์ด๋ ํ ๋ณํ๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ, ๋ฑ๋ก๋ Observer ๊ฐ์ฒด์ ๋ณํ๋ฅผ ์๋ ค์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.
๋ผ์ด๋ธ๋ฐ์ดํฐ๋ฅผ ์ฒ์ ์ ํด ๋ณธ๋ค๋ฉด ๋ฌด์จ ๋ง์ธ์ง ๋ฐ๋ก ์ดํดํ๊ธฐ ํ๋ค ์ ์๋ค. ๋ผ์ด๋ธ๋ฐ์ดํฐ๋ฅผ ์ ๋๋ก ์ดํดํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Observer Pattern
, Lifecycle
๋ ๊ฐ์ง์ ๋ํด ๋จผ์ ์ดํดํด์ผ ํ๋ค.
์ต์ ๋ฒ ํจํด(Observer Pattern)์ด๋?
๊ฐ์ฒด
์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ Observer
๋ค์ ๋ชฉ๋ก์ ๊ฐ์ฒด์ ๋ฑ๋กํ์ฌ, ์ํ ๋ณํ
๊ฐ ์์ ๋๋ง๋ค ๋ฑ๋ก๋ Observer์๊ฒ ํต์ง
ํ๋๋ก ํ๋ ๋์์ธ ํจํดLiveData๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๊ณ , ๋๊ตฐ๊ฐ์๊ฒ ์ด LiveData๋ฅผ ๊ด์ฐฐ(observe)ํ๋๋ก ํ ์ ์๋ค. ์ด ๋, livedata๋ ๋๊ฐ ์์ ์ ๊ด์ฐฐํ๊ณ ์๋์ง ์์ ์ Observer๋ค์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ณ ์๋ค. ๊ทธ๋ฌ๋ค LiveData๊ฐ ๊ฐ๊ณ ์๋ ๋ฐ์ดํฐ์ ์ด๋ค ๋ณํ๊ฐ ์ผ์ด๋ ๊ฒฝ์ฐ, ๋ฑ๋ก๋ Observer๋ค์๊ฒ ๋ณํ๋ฅผ ํต์งํด ์ค์ผ๋ก์จ Observer๋ค์ ๋ณํ๋ฅผ ๊ฐ์งํ๊ฒ ๋๋ค.
ํํ ์ ๋ฌธ ๊ตฌ๋ ์ ์์๋ก ๋ง์ด ๋๋๋ฐ, ํธ๋ ๋์ ๋ง๊ฒ ์ ํ๋ธ์ ๊ฒฝ์ฐ๋ ์๊ฐํด ๋ณด์. ์์ฒญ์๋ค์ด ์ด๋ค ์ ํ๋ธ ์ฑ๋์ ๊ตฌ๋ (๊ด์ฐฐ)ํ๋ฉด, ์ ํ๋ฒ(livedata)๊ฐ ์์์ ์ฌ๋ ธ์ ๋(๊ฐ๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์์ ๋) ๊ตฌ๋ ํ ์์ฒญ์๋ค์๊ฒ ์๋ฆผ์ ๋ณด๋ด ์ค๋ค. observer pattern์ด ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ณด๋ฉด ๊ตฌ๋
์๋น์ค์ ๋ง์ด ๋ฎ์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋๋๋ฐ, ์ด์ฒ๋ผ observer ํจํด์ ๋ฐํ/๊ตฌ๋
ํจํด
์ด๋ผ๊ณ ๋ ํ๋ค.
โถ ์ฐธ๊ณ (Observer pattern / Pubsub pattern์ ๋ค๋ฅด๋ค)
์ํค์๋ observer ํจํด์ ๋ฐํ/๊ตฌ๋ (Publish/Subscribe, ์ค์ฌ์ Pub/Sub) ํจํด์ด๋ผ๊ณ ๋ ํ๋ค๊ณ ๋์์์ง๋ง, ์ฝ๊ฐ์ ์ฐจ์ด๋ ์๋ ๊ฒ ๊ฐ๋ค. ์๋ฏธ๋ ๋น์ทํ์ง๋ง observer์ subject(๊ฐ์ฒด) ์ฌ์ด์ message broker์ ์ ๋ฌด ์ฌ๋ถ์์ ์ค๋ ๊ฒฐํฉ๋ ์ฐจ์ด ๋ฑ์ด ์๋๋ฐ, ์์ธํ ๋ด์ฉ์ ์๋์ ๋งํฌ์ ์ ์ค๋ช ๋์ด ์๋ค.

์ต์ ๋ฒ์ ์ถ๊ฐ, ์ ๊ฑฐ๊ฐ ์์ ๋กญ๊ณ ๊ฐ์ฒด์ ์ต์ ๋ฒ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ ๋ฑ ์ต์ ๋ฒ-๊ฐ์ฒด ๊ฐ ์ํธ์์กด์ฑ์ ์ต์ํ ํ ์ ์์ผ๋ฏ๋ก ๋ณ๊ฒฝ์ ์ ์ฐํด์ง๋ค๋ ์ฅ์ ์ ๊ฐ์ง๋ค. ์ด๋ MVVM ๋์์ธ ํจํด์์ ์๊ธฐํ๋ ๋ชฉํ, ์ฆ ๊ณ์ธต ๊ฐ ์์กด์ฑ์ ์ต๋ํ ์์ฐ์ผ๋ก์จ ์ ์ง๋ณด์์์ ์ด์ ์ ๊ฐ์ ธ๊ฐ๋ค๋ ๋ชฉํ์๋ ๋ง๋ฟ์์๋ค๋ ์๊ฐ์ด ๋ ๋ค.
Lifecycle์ ์๊ณ ์๋ค
์๋ช
์ฃผ๊ธฐ(Lifecycle)๋ฅผ ์๊ณ ์๋ค๋ ๋ง์, ํ์ฑ ์ํ์ ์๋ ์ปดํฌ๋ํธ์ Observer๋ค๋ง ๊ฐฑ์ ํ๋ ๊ฒ์ด ๋ณด์ฅ
๋๋ค๋ ์๋ฆฌ๋ค. ์ฌ๊ธฐ์ ์ค๋ ์ฅ์ ๋ค์ด ์ด๋ค ๊ฒ๋ค์ด ์์๊น ํ๋ฒ ์๊ฐํด ๋ณด์.
์ฐ์ view๊ฐ destroy๋๋ฉด ์์์ observe ์ํ๋ฅผ ํด์ ํ๋ค. ๊ทธ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์
์ ์ํ์ด ์๊ณ , ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ทฐ์ ์ ๊ทผํ๋ฉฐ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ์ฌ์ง๋ ์๋ค. ๋ํ ๊ธฐ๊ธฐ ํ์ ๋ฑ์ผ๋ก ๋ทฐ๊ฐ ๋ค์ ์์ฑ๋๋ฉด ์์์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ ๋ ๋ฐ์์ค๋ฉด์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค.
๋ฌผ๋ก LiveData๊ฐ ์๋๋ผ Rxjava๋ฅผ ์จ๋ lifecycle์ ์ ์ดํดํ๊ณ ์ฒ๋ฆฌํด ์ฃผ๋ฉด ์๊ด ์์ง๋ง, ๋์ ๊ฐ๋ฐ์๊ฐ ํญ์ ์ ๊ฒฝ์ฐ๊ณ ๊ด๋ฆฌํด์ผ ํ ์ฑ ์์ด ์๊ธฐ๊ฒ ๋๋ค. ์ค์๊ฐ ์๊ธธ ์ ์๋ ๊ตฌ์กฐ์ ์ค์ํ์ง ์์์ผ ํ๋ ๊ตฌ์กฐ์ ์ฐจ์ด๋ ๊ต์ฅํ ํฌ๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ ๊ฐ์ด lifecycleOwner, Observer๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉํ๋ค. lifecycleOwner๋ Observer๊ฐ ๋ฐ๋ผ๊ฐ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋งํ๋๋ฐ ๋ณดํต์ ๊ฒฝ์ฐ observer๊ฐ ์ ์ธ๋ ๋ทฐ๋ฅผ owner๋ก ๊ฐ์ง๋ค. MainActivity๋ฅผ lifecycleowner๋ก ๊ฐ๊ณ ์๋ observer๋ MainActivity๊ฐ ์ข ๋ฃ๋ ๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋๋ค.
- viewModel์์ liveData ์ ์ธ, postValue๋ฅผ ํตํด ๊ฐ ๋ณ๊ฒฝ
val itemLiveData = MutableLiveData<List<Item>>()
// ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์
// ex) val stores = some data (List<Item> ํํ)
itemLiveData.postValue(stores)
//observer
viewModel.itemLiveData.observe(this@MainActivity) { it->
// ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ ๋ ์คํ๋ ํจ์๋ฅผ ๋๋ค์์ผ๋ก ์ต์ ๋ฒ์ ์ ๋ฌ
// ex) storeAdapter.updateItems(it)
})
Activity๋ณด๋ค๋ viewModel์์ ์ ์ํ๊ณ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋์ผ Activity๋ data๋ฅผ displayํ๋ ์ญํ , ์ฆ view์ ์ญํ ๋ง์ ์ํํ๊ฒ ๊ฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ LiveData๋ฅผ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ์ ์์ง๋ง Databinding, RoomDB ๋ฑ AAC์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ํจ๊ป ์ฌ์ฉํ๋ฉด ํจ์ฌ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ex) Room๊ณผ ํจ๊ป, DB๋ด์ฉ์ ๊ด์ฐฐํด์ ์๋์ผ๋ก ๊ฐฑ์ ํ๊ธฐ ์ํด ์ฌ์ฉ
- Dao์ getAll ํจ์ ๋ณ๊ฒฝ (๋ฐํ type์ List<Todo> โ LiveData<List<Todo>>)
@Dao interface TodoDao { @Query("SELECT * FROM Todo") // fun getAll(): List<Todo> fun getAll(): LiveData<List<Todo>> . . . }
- DB์ insert ์ ์๋์ผ๋ก UI ๊ฐฑ์
db.todoDao().getAll().observe(this, Observer {todoList -> tvTodoList.text = todoList.toString() }) btnTodo.setOnClickListener { db.todoDao().insert(Todo(etTodo.text.toString())) // tvTodoList.text = db.todoDao().getAll().toString() }
vs RxJava(or RxKotlin, RxAndroid)
LiveData์ RxSomething๋ค์ ๋๋ค reactiveํ ๊ฐ๋ฐ ํจ๋ฌ๋ค์์ ์ํด ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ด๋ป๊ฒ ๋ณด๋ฉด ๋น์ทํ ์ญํ ์ ์ํํ๋ค๊ณ ๋ณผ ์ ์๋ค. ํ์ง๋ง ๋ถ๋ช ํ ์ฐจ์ด์ ์ ์กด์ฌํ๋ค. ์์ ๋ถํฐ ์ด ์ฐจ์ด๊ฐ ๊ถ๊ธํด์ ์ข ์์ธํ ์์๋ณด๊ณ ์ ๊ณ ์ถ์๋ ์ฃผ์ ์ด์ง๋ง, ์๊ธฐ๊ฐ ๊ธธ์ด์ง ๊ฒ ๊ฐ์ ๋ค์ ๊ธ์ ์ ๊ฒ ์ต๋๋ค!
์ฐธ๊ณ
https://developer.android.com/topic/libraries/architecture/livedata
https://ko.wikipedia.org/wiki/์ต์๋ฒ_ํจํด
https://jistol.github.io/software engineering/2018/04/11/observer-pubsub-pattern/
Uploaded by Notion2Tistory v1.1.0