ViewModel는 뭐니? 왜 쓰니?

Arakene·2024년 11월 20일

ViewModel이란?

소프트웨어 개발 아키텍처 패턴중 하나인 MVVM 아키텍처 패턴에서 파생된 개념으로 View와 Model 사이에서 매개체 역할을 하고, View의 데이터를 관리하는 역할을 한다.
MVVM을 가장 많이 사용해왔었기에 MVVM의 viewModel과 aac의 viewModel의 장점 모두 정리하려한다.

AAC ViewModel은?

Android Architecture Componenet의 ViewModel로 앱의 Lifecycle을 고려하여 UI 관련 데이터를 저장하고 관리하는 역할을 한다.

왜 사용하는가?

UI 컨트롤러의 데이터를 캡슐화하여 구성이 변경되어도 데이터를 유지하고, 과도한 책임을 분담하여 유지보수, 재사용성, 테스트 등을 용이하게 만들어 준다.
Activity와 fragment와 같은 UI 컨트롤러의 로직에서 데이터를 다루는 로직을 분리하기 위해 등장한 Android JetPack 라이브러리이다.
공식 홈페이지에서는 주요 이점을 아래 두가지로 설명해준다.

  • UI 상태를 유지할 수 있습니다.
  • 비즈니스 로직에 대한 액세스 권한을 제공합니다.

수명주기는

Scope와 연관이 있다. 뷰모델은 scope로 지정된 ViewModelStoreOwner가 사라질때 까지 메모리에 남아 있는다.

  • Activity가 종료될 때
  • fragment가 detatch 될 때
  • Navigation Entry인 경우 백스택에서 사라질 때

뷰모델이 사라진다.
아래 이미지는 Activity가 회전하는 경우와 뷰모델의 생명주기를 설명하는 이미지다

activity가 파괴된 후 재생성이 되어도 종료되지 않았기에 UI에 대한 데이터를 계속해서 보존하고 재사용할 수 있다.

viewModel이 제거될 때

ViewModelStoreOwner가 파괴될 때 뷰모델은 onCleared라는 콜백을 실행하게 된다. 해당 함수를 사용함으로써 ViewModel의 생명주기에 따라 작업을 정리할 수 있다.

class MyViewModel(
    private val coroutineScope: CoroutineScope =
        CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
) : ViewModel() {

    // Other ViewModel logic ...

    override fun onCleared() {
        coroutineScope.cancel()
    }
}

lifecycle version 2.5 이상부터는 ViewModel의 생성자에 하나이상의 Closeable 오브젝트를 추가할 수 있다. 해동 오브젝트는 뷰모델 인스턴스가 삭제될 때 자동으로 close 해준다.

class CloseableCoroutineScope(
    context: CoroutineContext = SupervisorJob() + Dispatchers.Main.immediate
) : Closeable, CoroutineScope {
    override val coroutineContext: CoroutineContext = context
    override fun close() {
        coroutineContext.cancel()
   }
}

class MyViewModel(
    private val coroutineScope: CoroutineScope = CloseableCoroutineScope()
) : ViewModel(coroutineScope) {
    // Other ViewModel logic ...
}
profile
안녕하세요 삽질하는걸 좋아하는 4년차 안드로이드 개발자입니다.

0개의 댓글