1 minute read

ViewModel 사용해서 간단한 앱 만들기

Activity의 lifecycle은 onCreate()로 생성되어서 onStart(), onResume() 로 실행된다.
이때 액티비티에 무슨 일이 생기면(예: 화면을 돌렸다) onPause(), onStop(), 그리고 onDestroy()로 액티비티가 잠시 종료되고 다시 onCreate()로 새 액티비티가 생성된다.

이때 생기는 문제는 액티비티에서 하던 일에 대한 정보가 다 날아간다는 것이다. 그래서 activity의 lifecycle에 묶여 있지 않은 저장 공간이 필요하다.

이때 ViewModel을 쓴다. ViewModel의 lifecycle은 activity의 생성과 종료에 의존하지 않기 때문이다.

0. View Binding 하기

layout에 있는 여러 view들을 activity.kt에서 참조할 때 쓸 수 있는 방법은 findViewById<TYPE_xxx>(R.id.xxx) 가 있다.
하지만 이 방법은 불편하고, 서로 다른 layout의 많은 view들의 ID가 겹치면 헷갈린다는 단점이 있다. 그래서 view Binding을 사용한다.

먼저 gradle(app)에서 다음을 추가해 준다.

android {
  ...
  buildFeatures {
    viewBinding = true
  }
}

그리고 binding을 할 activity에 가서 다음을 추가한다. 예시는 MainActivityt.kt의 경우이다.

class MainActivity : AppCompatActivity() {

    private lateinit var binding : ActivityMainBinding
    ...
}

그리고 해당 액티비티의 onCreate() 함수 안에 lateinit을 처리해 준다.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

ActivityMainBinding에 ctrl+B를 눌러 보면, 해당 액티비티의 layout을 담당하는 xml 파일을 볼 수 있다.

이제 액티비티 클래스 내에서 binding.___ 를 통해 해당 액티비티의 layout에 있는 view들에 접근할 수 있게 됐다.

1. ViewModel 만들기

가장 먼저 gradle(App)에 dependency를 추가해 준다.

dependencies {
  ...
  implementation 'androidx.activity:activity-ktx:1.3.1'

그리고 새 kotlin class를 만들어 준다.

class MainViewModel : ViewModel() {

}

그리고 이 ViewModel을 사용할 Activity 클래스 안에서 viewmodel을 생성해 주면 된다.

class MainActivity : AppCompatActivity() {
  ...
  private val viewModel : MainViewModel  by viewModels()

ViewModel 생성이 끝났다.