안드로이드 공식 문서에 보면 ViewModel은 비지니스 로직 및 해당 상태 홀더라고 설명합니다.
직역 하면 사용자 이벤트를 처리하고 데이터 또는 도메인 레이어의 데이터를 화면 UI 상태로 변환시키고, 컴퓨터 프로그램 로직에 따라 데이터를 생성/표시/저장/변경 한다는 뜻입니다.
더 나아가 Activity나 Fragment등 생명주기(LifeCycle)를 고려해 UI관련 데이터를 저장하고 관리할 수 있도록 해준다는 것입니다..
-> 보여지는(View) 데이터(Model)를 저장하고 관리한다.
Activity나 Fragment의 생명이 Destroy 되면 데이터도 같이 초기화가 되는 것을 볼 수 있습니다.
그림 처럼 ViewModel 생명주기를 보면 Activity가 Destroy 되어도 ViewModel 생명은 살아있습니다.
XML 구성은 Up버튼과 Down버튼 값을 보여주는 TextView로 구성되어 있습니다.
ViewModel에서 num을 1씩 증가와 감소 해주는 기능을 만들었습니다.
class MainViewModel : ViewModel() {
var num : Int = 0
fun up()
{
num += 1
}
fun down()
{
num -= 1
}
}
ViewModelProvider로 부터 ViewModel을 생성하고 Up버튼과 Down버튼을 눌렸을 때 값이 변경되도록 합니다.
변경된 값은 ViewModel로 하여금 데이터가 관리되고 있고 numText UI에 값이 보여지도록 합니다.
private lateinit var viewModel : MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val upButton = findViewById<Button>(R.id.upBtn)
val downButton = findViewById<Button>(R.id.downBtn)
val numText = findViewById<TextView>(R.id.numText)
viewModel = ViewModelProvider(this)[MainViewModel::class.java]
setNum(numText)
upButton.setOnClickListener {
viewModel.up()
setNum(numText)
}
downButton.setOnClickListener {
viewModel.down()
setNum(numText)
}
}
private fun setNum(numText : TextView)
{
numText.text = viewModel.num.toString()
}
결과처럼 데이터가 저장되어 Activity나 Fragment가 Destroy되어도 값이 초기화 되지 않는 걸 볼 수 있습니다.
참고자료