๐ฑ dreaming DiNO
[Android] MVVM ๋ณธ๋ฌธ
MVVM - Model, View, ViewModel
MVVM ์ ๊ฐ๋ ์ ๊ธฐ์ด๋ PM(Presentation Model - ๋งํดํ์ธ๋ฌ์ ์ ์)์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด ์ก๋ค. PM ์ View์ ๋ ๋๋ง์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ด๊ณ , View ๋ PM ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋งํ๋ค. PM ์ ์ค์ํ ํฌ์ธํธ๋ PM ์ด ๋ค๊ณ ์๋ ๋ฐ์ดํฐ์ View๋ ํญ์ ๋๊ธฐํ๊ฐ ๋์ด์ผํ๋ค๋ ๊ฒ. ์ฌ๊ธฐ์ ํ์ PM ์ ViewModel ์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ช ๋ช ํ๋ฉด์ MVVM์ด ํ์ํ๋ค.
์ ์ฒด ์์ ์ UI ๋ก์ง ์์ ๊ณผ ๋น์ฆ๋์ค ๋ก์ง ์์ ์ผ๋ก ๋๋ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋์ด์ง ์์ ์ ๋์์ธ์ ํนํ๋ UI ๊ฐ๋ฐ์๋ UI์ชฝ์ ๋ด๋นํ๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ํนํ๋ ๊ฐ๋ฐ์๋ ๋๋จธ์ง ๋ถ๋ถ์ ๋ด๋นํ ์ ์๋๋ก ํ๊ธฐ ์ํด์ ๋๋์ด์๋ค.
MVVM์ Model, View, ViewModel์ ์ฝ์์ด๊ณ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- View
- ํ๋ฉด์ ํํ๋๋ ๋ ์ด์์์ ๋ํด ๊ด์ฌ.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋น์ง๋์ค ๋ก์ง์ ๋ฐฐ์ ํ์ง๋ง UI ๊ด๋ จ๋ ์ผ๋ถ ๋ก์ง์ ์ํํ ์ ์๋ค.
- ์ฌ๋๋ค ๋ง๋ค ์๊ฒฌ์ด ๋ค๋ฅผ ์ ์๊ณ , ‘์๋๋ก์ด๋ ๋ด๋ถ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ฆฌ๋ ๊ธฐ๋ฅ๋ง ์ํํด์ผ ํ๋ค’ ๋ผ๋ ์๊ฒฌ์ ๊ฐ์ง ์ด๋ ์๋ค.
- ViewModel ์ ๊ด์ฐฐํ๊ณ ์๋ค๊ฐ ์ํ ๋ณํ๊ฐ ์ ๋ฌ๋๋ฉด ํ๋ฉด์ ๊ฐฑ์ ํด์ผํ๋ค.
- ViewModel
- View์ ์ฐ๊ฒฐ ํ ๋ฐ์ดํฐ์ ๋ช ๋ น์ผ๋ก ๊ตฌ์ฑ. ๋ณ๊ฒฝ ์๋ฆผ์ ํตํด View์ ์ํ ๋ณํ๋ฅผ ์ ๋ฌํ๋ค. ๊ทธ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ฐ์ ํ๋ ์ฌ๋ถ๋ View๊ฐ ํํ๋๋ก ํ๋ฉฐ ๋ช ๋ น์ UI ๋ฅผ ํตํด์ ๋์ํ๋๋ก ํ๋ค.
- ๋น๋๊ธฐ ์์ ํตํด UI์ ์๋ต์ฑ์ ์ ์ง. ์ฌ์ฉ์์ ์ฑ๋ฅ ์ธ์ ๊ธฐ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด UI ์ค๋ ๋๋ฅผ ์ฐจ๋จ ํด์ ๋ ์ํ๋ก ์ ์งํด์ผํ๋ค. View Model ์์ I/O ์์ ์ ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ณ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผ View์ ์์ฑ๋ณ๊ฒฝ์ ์๋ฆฐ๋ค.
- View Model ๊ณผ Model ์ฌ์ด์๋ ์ผ๋ ๋ค ๊ด๊ณ๊ฐ ์์ผ๋ฉฐ ViewModel์ View์ ์ปจํธ๋กค์ด ์ง์ data binding ์ ํ ์ ์๋๋ก View ์ Model ํด๋์ค๋ฅผ ์ง์ ๋ ธ์ถ ํ๋๋ก ์ ํํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ์๋ Model ์ data binding์ ์ง์ํ๊ณ notification even ๋ฅผ ๋ณ๊ฒฝ ํ ์ ์๋๋ก ๋์์ธ ๋์ผํ๋ค.
- AAC(Android Architecture Component) ์ ViewModel ์ LifeCycle ์ ๊ณ ๋ คํ์ฌ UI ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋๋ก ์ค๊ณ๋๋ค. ViewModel ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฉด ํ์ ๊ณผ ๊ฐ์ด ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค.
- Andorid ์์ MVVM ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด, ๋ฐ๋์ AAC ์ ViewModel ์ ์ฌ์ฉํ์ง ์์๋ ๊ตฌํ์ ๊ฐ๋ฅํ๋ค.
- View์ ์ํ์ ํ๋์ด ์ถ์ํ ๋๊ฒ.
- View์ input๊ณผ output์ด ๋ช ์๋์ด ์๋ ์ธํฐํ์ด์ค
- ์์ํจ์ ์ฒ๋ผ ๊ฐ์ ๊ฐ์ input์๋ ํญ์ ๊ฐ์ ๊ฐ์ output์ด ๋ฐํ๋์ด์ผํจ
- output์ View์ ์ํ์ Route๋ก ๋๋จ
- Model
- App ์ ๋ฐ์ดํฐ๋ฅผ ์บก์ํ ํ๋ ๋น์๊ฐ์ ํด๋์ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ก์ธ์ค ํ๊ฑฐ๋ ์บ์ฑ์ด ํ์ํ ์๋น์ค ๋๋ ๋ ํฌ์ง ํ ๋ฆฌ์ ํจ๊ป ์ฌ์ฉ๋๋ค.
- ViewModel ์์ data๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ์ค๋นํ๊ณ , ๊ทธ์๋ํ event ๋ฅผ ๋ณด๋ธ๋ค.
View ์ ViewModel ์ ์์ง๋ง ViewModel ์ View๋ฅผ ์ ์ ์๊ณ ,
ViewModel์ Model์ ์์ง๋ง Model์ ViewModel์ ๋ชฐ๋ผ์ผํ๋ค.
MVVM ์ MVP ์ ๋ฐ๋๋ก View ๊ฐ ๋ฅ๋์ ์ด๋ค. View ๊ฐ ์ค์ค๋ก ViewModel ๊ฐ์ฒด์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ํ์ํ์ง ์ง์ ์ ์ผ๋ก ๊ด์ฐฐํ๋ค. ๊ด์ฐฐ ํ๊ธฐ ์ํด์๋ ViewModel ์ ๋ฐ์ดํฐ๋ ๊ด์ฐฐ ๊ฐ๋ฅํ ํํ์ฌ์ผํ๋ค.
LiveData, ObservableField ๊ฐ์ฒด(Google) ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, Observable ๊ฐ์ฒด(RxJava)๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ณํ๊ฐ ์๊ธฐ๋ฉด ์ฆ์ View๋ ์๋ฆผ์ ๋ฐ๊ณ , ์๋ง์ View ๋ ๋๋ง ๋ก์ง์ ์ํํ๊ฒ ๋๋ค.
Google์์ ์ ์ํ ์์ ์์๋ 2๊ฐ์ง ํํ๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ViewModel ๋ด๋ถ์ ๋ฉ์๋๋ฅผ ์ง์ ํธ์ถ
- MVP ์ ๋์ผํ ๋ฐฉ๋ฒ
- ๋ณ๋์ ์ธํฐํ์ด์ค๋ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋น์ฆ๋์ค ๋ก์ง์ ์์ํ๋ ๊ฒ์ด ๋ก์ง์ ๋ถ๋ฆฌํ๋ ์ธก๋ฉด์์ ๋ฐ๋์ง
- ViewModel ๋ด๋ถ์ ์๋ CommandObservable ๊ฐ์ฒด๋ฅผ ํตํด ํธ์ถ
- View์์ ๋ฐ์ํ Action์ ์ ๋ฌ๋ง ํ ๋ฟ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ๋ ํด๋น CommandObservable์ ๊ด์ฐฐํ๋ ์ชฝ์์ ๋ด๋นํ๊ธฐ ๋๋ฌธ์ ๋น์ฆ๋์ค ๋ก์ง์ ์ข ๋ ๊ฐ์ ๋ก ๋ถ๋ฆฌ ํ ์ ์๋ค.
- ํ์ง๋ง CommandObservable์ ๊ด์ฐฐํ๋ ๊ฐ์ฒด๊ฐ ViewModel ์์ ์ด๋ผ๋ฉด ๊ทธ๊ฒ์ ๋ถํ์ํ ๊ด์ฐฐ์ด ๋ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ CommandObservable์ ์ฌ์ฉ ํ๋ค๋ฉด ViewModel ์ด ์๋ ๋ค๋ฅธ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๊ฐ์ฒด๊ฐ ๊ด์ฐฐ์ ํ๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
MVC ์ MVVM ์ ์ฐจ์ด๋ ๊ทธ๋ฆผ ํ์ฅ์ด๋ฉด ์ถฉ๋ถํ ๊ฒ ๊ฐ์์ ๊ฐ์ ธ์๋ค.
MVVM ์ผ๋ก ๊ฐ๋ฐ์์๋ Databinding ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค. View์ dependency ๋ฅผ Activity, Fragment ์์กด์์ xml ์์กด์ผ๋ก ๋ด๋ฆด ์ ์์ผ๋ฉฐ ๋ค์์ ๊ทธ๋ฆผ์ผ๋ก ํํ์ด ๊ฐ๋ฅํ๋ค.
View๋ ์ค์ XML ๋ง ์กด์ฌํ๋ฉฐ View์ ์ฝ๋์ ์ผ๋ก ์ ๊ทผํ ์ผ์ด ์๋ค๋ฉด BindingAdapter ์ InverseBindingAdapter ๋ฅผ ํตํด ์ ๊ทผํ๊ณ , ์ํ๊ฐ์ ํตํด View๋ฅผ ๊ฐฑ์ ํ๋ค. ViewModel ์ View์ ํํํ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์์ผ๋ฉด์ MVP ์ Presenter์ ๊ฐ์ด ๋น์ฆ๋์ค ๋ก์ง๊ณผ View ์ฌ์ด์ ์ค์ฌ์ ์ญํ ์ ํ๋ค.
ViewModel ๋ด๋ถ์๋ observable ํ๋๋ค์ ์ ์ํ๊ณ , View์ Action์ ๋ฐ์ interface ๋๋ CommandObservable ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ๋ฉด ๋๋ค. ViewModel ์์ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฐ์ xml ์์ observing ํ๊ณ ํ์ํ View์ Action ์ ํธ์ถํ๋๋ก ๋ง๋ค๋ฉด ๋ถ๋ฆฌ๋ ์์ญ ๋ด์์ ์๋ก ๋ถ๋ชํ์ง ์๊ณ ์์ ์ด ๊ฐ๋ฅํ๋ค. ๊ฐ ๋ชจ๋๊ฐ์ ์์กด์ฑ์ด ๋ฎ๊ธฐ์ ๊ฐ์์ ํํธ์์ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋๋ฐ ๋ถํธํจ์ด ์ค์ด๋ ๋ค.
- UI ๊ฐ๋ฐ์๋ xml, BindingAdapter, InverseBindingAdapter๋ง ๊ฐ๋ฐ
- ๋น์ฆ๋์ค ๋ก์ง ๋ด๋น์๋ ๋๋จธ์ง ๋ถ๋ถ์ ๊ฐ๋ฐ
MVP ์์๋ ์์ญ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅ์ ํ์ง๋ง ์ถฉ๋ ์์ญ์ด ์๊ธด๋ค. View๋ Presenter ๋ฅผ , Presenter๋ View ๋ฅผ ํธ์ถํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ ์์ญ์ด ๊ฒน์น๊ณ ํด๋น ๋ถ๋ถ์์ ์ถฉ๋์ด ๋ฐ์ ํ ์ ์๋ค.
databinding ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, xml ์ด ๋์์ธ ์์ ๋ฐฐ์น๋ฅผ ๋ด๋นํ ๋ฟ ์๋๋ผ, ViewModel ์ ํตํด data ์ฐ๊ฒฐ๊ณผ ์ด๋ฒคํธ ์ ๋ฌ์ ์ญํ ์ ํ๋ค.
ํน์ View์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋งคํ๋๋์ง xml์์์ ๋ฐ๋ก ์ ๋ ฅ์ด ๊ฐ๋ฅํ๊ณ , observe ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋น๋์ ์์์ observe ํจ์๋ฅผ ์๋ ์์ฑํ๋ค. MVP ๋ ๊ธฐ์กด์ ๋ฐฉ๋ฒ์ผ๋ก ๋งคํ ํ๋ ค๋ฉด ๊ฐ๊ฐ์ View ์ id ๋ฅผ ๋ถ์ฌํ๊ณ ํด๋น View ๋ฅผ findViewById ๋ฑ์ผ๋ก ์ฐธ์กฐ๋ฅผ ๊ฐ์ ธ์จ ํ์, ๋ฐ์ดํฐ ์ธํ ํด์ผํ๋๋ฐ, databinding ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ด๋ ์์ด๋ ์์์ ๋งคํ์ํจ๋ค.
MVVM ์ ์ฅ์
- ViewModel ์ด model ์ ์ด๋ํฐ ์ญํ ์ ํ์ฌ model ์ ์ฃผ์ํ ์ฝ๋ ๋ณ๊ฒฝ์ ๋ฐฉ์ง ํ ์ ์๋ค.
- ๊ฐ๋ฐ์๋ View๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ViewModel ๋ฐ Model ์ ๋ํ Unit ํ ์คํธ๋ฅผ ๋ง๋ค ์ ์๊ณ , ViewModel ์ ๋ํ Unit ํ ์คํธ๋ View ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ ํํ๊ฒ ๋์ผํ ๊ธฐ๋ฅ ์คํ์ ํ ์ ์๋ค. -> UI, ๋น์ง๋์ค ๋ก์ง, DB ๋ค์ด ๊ธฐ๋ฅ๋ณ๋ก ๋ชจ๋ํ๊ฐ ๋์ด์๊ธฐ ๋๋ฌธ
- ์์ ํ๊ฒ ์๋กญ๊ฒ ๊ตฌ์ฑ๋๋ UI๋ฅผ ๋ค์ ๋์์ธ ํ์ฌ๋ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ๋ง๋ค ์ ์๋ค. ์๋กญ๊ฒ ๋ง๋ค์ด์ง View ์์๋ ๊ธฐ์กด์ ViewModel ๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ด ์ํ์ด ๊ฐ๋ฅํ๋ค.
- UI ๊ฐ๋ฐ์์ ๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ์๊ฐ ๊ฐ๊ฐ์ ๋ถ๋ฆฌ๋์ด ๋์์ ์์ ์ด ๊ฐ๋ฅํ๋ค.๋น์ฆ๋์ค ๋ก์ง ๊ฐ๋ฐ์๊ฐ ViewModel ๊ณผ Model ์ ์์์์ ์์ ์ ํ๊ณ ์์ ๋ UI ๊ฐ๋ฐ์๋ View์๋ง ์ง์คํ์ฌ ์์ ํ ์ ์๋ค.
- ViewModel ์ ํตํด data ๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ Activity, Fragment ์ ์๋ช ์ฃผ๊ธฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ๋ํ View๊ฐ ํ์ฑํ ๋์ด์์ ๊ฒฝ์ฐ์๋ง ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค.
- ViewModel๊ณผ View๊ฐ ์ผ ๋ ๋ค ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ViewModel ์ ๋ฉ์๋๋ฅผ A-Activity, B-Activity ๋ฑ ์ฌ๋ฌ View์์ ํธ์ถํด ์ฌ ์ฌ์ฉํ๊ธฐ ํธํ๋ค. ์ฌ์ค ํด๋น ๊ตฌ์กฐ๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง ๊ฒฝ์ฐ์ ์๊ฐ ๊ทนํ ์ ๋ค.
- binding๋๋ ์์ ์ ๋ชจ๋ input์ ๋ํ output์ ์ฐ์ถํ๋ ๋ก์ง์ด ์ ํด์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผํ๋ ์ํ์ ์ค์ฌ์ค๋ค.
- Databinding์ ํตํด ์๋ง์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ผ ์ ์๋ค.
๋จ์
- xml ๋ด๋ถ์์ ์ค๊ดํธ ์์ ์ ์ธํ๋ ๊ตฌ๋ฌธ์ ๋ณ๋์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๋ถํธํจ์ด ์๊ธด๋ค. ํน์ observing ํ๋๋ฅผ ์ฌ๋ฌ View์์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ ์ด ํ๋๋ฅผ ์ฐธ์กฐํ๋ View ๋ค์ ์ฐพ๊ธฐ ์ํด์๋ ํ ์คํธ ๊ธฐ๋ฐ ๊ฒ์์ ์๋์ผ๋ก ํด์ผํ๋ค.
- ๋ํ Xml escaping ์์ ๋ถํธํจ์ ๋๋ ์ ์๋ค. xml ์์๋ <, > ๋ฌธ์๊ฐ ํ์ฉ ๋์ง ์๊ธฐ ๋๋ฌธ์ < > ํ์์ผ๋ก ์จ์ผํ๋ค.
- ๊ธฐ์กด์ ๋นํด ์ถ๊ฐ๋ก ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ ํด๋์ค๋ ๋ง์ ์ ์์ผ๋ฉฐ, ์ฐ๊ฒฐํด์ฃผ์ด์ผํ๊ณ ํด๋น ๊ณผ์ ์ด ๋ณต์กํด์ง๋ฉด cost ๊ฐ ๋ง์ด ํ์๋ก ํ ์ ์๋ค.
XML ์ ์ ์ํ View ์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ ์ผ๋ฐ์ ์ผ๋ก ViewModel์ ๋งค๊ฐ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์๋ค.
- ViewModel ์ง์ ํธ์ถ ๋ฐฉ์
app:onRefreshListener="@{viewmodel::onRefresh}"
app:refreshing="@{viewmodel.dataLoading}"
android:onClick="@{() -> viewmodel.addNewTask()}"=
ViewModel์ ์ต์ ๋น ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๋ ์ฉ๋๊ฐ ์ฃผ์ ์ญํ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๋ฉ์๋๋ฅผ ViewModel ์ ๋ฃ๋ ๋ฐฉ์์ ์ง์ํ๋๊ฒ ์ข๋ค. ViewModel์ ๋น์ฆ๋์ค ๋ก์ง์ด ์ง์ ์ ์ผ๋ก ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ๋ ๊ฐ ํ๋ฉด์ด ํด๋น ๋น์ฆ๋์ค ๋ก์ง์ ํนํ๋๊ณ , ํด๋น ๋น์ฆ๋์ค ๋ก์ง์ด ๋ค๋ฅธ ๊ณณ์์ ์ฐ์ด์ง ์์์ผ ์ค๊ณ์ ์ผ๋ก ์๋ฏธ๊ฐ ์๋ค.
- Observing Command Field๋ฅผ ํตํ ๋ฐฉ์
- Add Command Observing Field
val snackbarMessage = SingleLiveEvent<Int>() val newTaskEvent = SingleLIveEvent<Void>()
- Observe Field
newTaskEvent.observe(this@Activity, Observer<Void>{ this@Activity.addNewTask() })
- Invoke Field
fun addNewTask(){ newTaskEvent.call() }
โ Observing Command ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์์ ๊ฐ์ด 3๊ฐ์ง ๋จ๊ณ๋ฅผ ๋ ์์ฑํด์ฃผ์ด์ผํ๋ค.
- ๊ด์ฐฐ ํ๋ ์ ์ธ
- ๋ก์ง ์ํ๋ถ์์ ๊ด์ฐฐ
- ํ๋๋ฅผ invoke ์์ผ Observer ๋ค์๊ฒ ์๋ ค์ค๋ค.
- ๊ธฐ์กด MVP ์์๋ ํจ์๋ฅผ ์์ฑํ๊ณ , ๊ทธ ํจ์๋ฅผ ์คํ๋ง ํ๋ฉด ๋์ง๋ง, ํด๋น ๋ฐฉ์์ ํจ์์ ํจ์ ์คํ ์ฌ์ด์ 3๊ฐ์ง ์ผ์ด ์ถ๊ฐ๋๋ค. ๊ด์ฐฐ ํฌ์ธํธ๋ฅผ ๋๋ ๊ฒ์ด ๊น๋ํ์ง๋ง ๋๋ถ๋ถ์ 1๊ณณ์์๋ง ํ์๋ก ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋์ด๋๋ ๋ถ๋ถ์ ์์ด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ์ ์ง๋ณด์๊ฐ ํ๋ค ์ ์๋ค.
- ๋ณ๋์ Listener๋ฅผ ํตํ ๋ฐฉ์์์ ๊ฐ์ด ๋ณ๋์ Listener๋ฅผ ๋๊ฒ ๋๋ฉด ViewModel ์์ ๋น์ง๋์ค ๋ก์ง์ ๋ผ์ด ๋ผ ์ ์์ด ์ข์ ์ ์ด ์๋ค. Listener์ ์ค์ ๊ตฌํ์ Binding์ด ์ผ์ด๋๋ ๊ณณ์์ ํ ์ ์๊ฒ ๋๋๋ฐ, ๊ทธ ๊ณณ์ด ๋ง์ฝ Activity ๋ Fragment๋ผ๋ฉด ํด๋น ํด๋์ค์ ๋น์ง๋์ค๋ฅผ ์์ฑํ๊ธฐ ๋ณด๋ค๋, ๋ณ๋์ ๋ถ๋ฆฌ๋ ํด๋์ค๋ก ์์ํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
-
listener = object : TaskDetailUserActionsListener{ override. fun onCompleteChanged(v : View){ viewmodel?.setCompleted((v as CheckBox).isChecked) } }
์ถ์ฒ : https://jjjoonngg.github.io/android%20architecture/MVVM/
'Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] Retrofit - Logging Interceptor ์ ํ์์ฑ (0) | 2021.12.07 |
---|---|
[Kotlin] Retrofit (๋ ํธ๋กํ) ์ด๋? (0) | 2021.11.24 |
[Kotlin] ๊ธฐ๋ณธ๋ฌธ๋ฒ-2 (0) | 2021.11.24 |
[Kotlin] ๊ธฐ๋ณธ๋ฌธ๋ฒ-1 (0) | 2021.11.24 |
[Android] JDK, SDK, NDK (0) | 2021.10.13 |