-
์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ฌ UI๊ด๋ จ ๋ฐ์ดํฐ ์ ์ฅ ํน์ ๊ด๋ฆฌ
-
ํ๋ฉด ํ์ ์ฒ๋ผ ๊ตฌ์ฑ๋ณ๊ฒฝ ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๊ฒ ํจ
-
ViewModel์ ์ฌ์ฉํ๋ฏ๋ก์จ ํด๊ฒฐ๋๋ ๋ฌธ์ ๋ค
- ์์คํ
์์ UI controller๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ค์ ๋ง๋ค ๊ฒฝ์ฐ, controller์ ์ ์ฅ๋์ด ์๋ ๋ชจ๋ UI ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ์์ค๋๋ค. ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ํด ์กํฐ๋นํฐ๊ฐ ์ฌ์์ฑ๋๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ค์ ๊ฐ์ ธ์์ผ ํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋จ์ํ ๊ฒฝ์ฐ์๋
onSaveInstanceState()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌonCreate()
๋ฒ๋ค์์ ๋ณต์ํ ์ ์์ง๋ง, ์๋์ ๋ฐ์ดํฐ๋ง ํด๋นํ๋ค. - UI controller๋ ๋น๋๊ธฐ ํธ์ถ์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ๊ธฐ์๋ ๋ง์ ์ ์ง๋ณด์๊ฐ ํ์ํ๊ณ , ์ปดํฌ๋ํธ ๋ณ๊ฒฝ ์ ๊ฐ์ฒด๊ฐ ์ฌ์์ฑ๋๋ฉด ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์คํ๋ ํธ์ถ์ ๋ค์ ํด์ผํ๋ ์ผ์ด ์๊ธฐ๋๋ฐ, ์ฌ๊ธฐ์ ๋ฆฌ์์ค์ ๋ญ๋น๊ฐ ๋ฐ์ํ๋ค.
- UI controller์ ๋ฐ์ดํฐ ๋ก๋๋ฅผ ๋ด๋นํ๋ฉด ํด๋์ค๊ฐ ํฝ์ฐฝ๋๊ณ , ํ ์คํธ๊ฐ ์ด๋ ต๋ค.
- ์์คํ
์์ UI controller๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ค์ ๋ง๋ค ๊ฒฝ์ฐ, controller์ ์ ์ฅ๋์ด ์๋ ๋ชจ๋ UI ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ์์ค๋๋ค. ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ํด ์กํฐ๋นํฐ๊ฐ ์ฌ์์ฑ๋๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๋ค์ ๊ฐ์ ธ์์ผ ํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋จ์ํ ๊ฒฝ์ฐ์๋
-
Ui controller logic ์ผ๋ก๋ถํฐ view data ์์ ๊ถ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก ViewModel์ด๋ค.
-
ViewModel ๊ฐ์ฒด๋ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ ๋์, ์๋์ผ๋ก ๋ณด๊ด๋๋ค. ๋ฐ๋ผ์ ViewModel์ด ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ ๋ค์ Activity๋ fragment instance์์ ์ฆ์ ์ฌ์ฉํ ์ ์๋ค.
-
๋ค์์ ์ฌ์ฉ์ ๋ชฉ๋ก์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ activity/fragment ๋์ ViewModel์ ํ ๋นํ๋ ์ฝ๋์ด๋ค.
-
class MyViewModel : ViewModel() { private val users: MutableLiveData<List<User>> by lazy { MutableLiveData().also { loadUsers() } } fun getUsers(): LiveData<List<User>> { return users } private fun loadUsers() { // Do an asynchronous operation to fetch users. } }
-
๋ค์์ activity์์ ๋ชฉ๋ก(๋ฐ์ดํฐ)์ ์ ๊ทผํ๋ ์ฝ๋์ด๋ค.
-
class MyActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { // Create a ViewModel the first time the system calls an activity's onCreate() method. // Re-created activities receive the same MyViewModel instance created by the first activity. // Use the 'by viewModels()' Kotlin property delegate // from the activity-ktx artifact val model: MyViewModel by viewModels() model.getUsers().observe(this, Observer<List<User>>{ users -> // update UI }) } }