[Android] ViewModel에 대해 알아보자

지금별·2024년 1월 20일
post-thumbnail

🤔 ViewModel 이란?

안드로이드 공식 문서에 보면 ViewModel은 비지니스 로직 및 해당 상태 홀더라고 설명합니다.

직역 하면 사용자 이벤트를 처리하고 데이터 또는 도메인 레이어의 데이터를 화면 UI 상태로 변환시키고, 컴퓨터 프로그램 로직에 따라 데이터를 생성/표시/저장/변경 한다는 뜻입니다.

더 나아가 Activity Fragment등 생명주기(LifeCycle)를 고려해 UI관련 데이터를 저장하고 관리할 수 있도록 해준다는 것입니다..

-> 보여지는(View) 데이터(Model)를 저장하고 관리한다.

1. ViewModel 사용 이유?

1.1 ViewModel 사용 안했을 때

ActivityFragment의 생명이 Destroy 되면 데이터도 같이 초기화가 되는 것을 볼 수 있습니다.




1.2 ViewModel 생명주기

그림 처럼 ViewModel 생명주기를 보면 ActivityDestroy 되어도 ViewModel 생명은 살아있습니다.




💻 ViewModel 구현

1. activity_main.xml

XML 구성은 Up버튼과 Down버튼 값을 보여주는 TextView로 구성되어 있습니다.

2. MainViewModel

ViewModel에서 num을 1씩 증가와 감소 해주는 기능을 만들었습니다.

class MainViewModel : ViewModel() {

    var num : Int = 0

    fun up()
    {
        num += 1
    }

    fun down()
    {
        num -= 1
    }
}

3. MainActivity

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()
    }

결과처럼 데이터가 저장되어 ActivityFragment가 Destroy되어도 값이 초기화 되지 않는 걸 볼 수 있습니다.




참고자료

ViewModel GitHub

0개의 댓글