코틀린(Kotlin)/TIL

[코틀린(Kotlin)] 뷰 모델 (ViewModel)

초보왕보초 2024. 2. 5. 20:36
728x90

1. 뷰 모델이란?

  • Activity와 Fragment와 같은 UI 컨트롤러의 로직에서 데이터를 다루는 로직을 분리하기 위해서 등장한
    Android JetPack 라이브러리.

 

 

2. 뷰 모델의 필요성

  • 안드로이드는 Activity와 Fragment 같은 UI 컨트롤러에서 리소스의 제거와 복구가 수행된다.

 

예시로,

화면 전환(가로/세로)이 이루어질 때 Activity가 onDestroy 된 다음, 다시 화면이 onCreateonStart가 되기 때문에

특정 데이터들이 날아갈 수 있다.

 

이는 생명주기와 관련 있는데,

class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState) 
        setContentView(R.layout.activity_main)
    }
}

화면전환을 하는 등의 이벤트로 데이터가 날아가는 문제를 해결하기 위해 기존에는 savedInstanceState를 이용했다.

하지만 이 방법에는 문제가 존재한다.

  1. 담을 수 있는 데이터가 적다.
    (공식 문서에 따르면 Parcelables and Bundles에서 50k 미만의 데이터를 권장한다)
  2. 담을 수 있는 데이터의 형태가 제한된다.
  3. onCreate에서 작업을 처리해야 하므로 UI 컨트롤러가 해야 할 일이 늘어나면서 화면을 띄우는데 시간이 오래 걸리게 된다.

Activity나 Fragment와 같은 UI 컨트롤러에서 데이터를 관리하면 생명주기에 따라 값이 사라지는 문제가 생기고,

savedInstanceState로 데이터를 저장하면 다음과 같은 문제가 존재한다.

 

이를 해결하기 위해 나온 것이 바로 뷰 모델(ViewModel)이다.

 

 

3. 뷰 모델의 생명주기

뷰 모델의 생명주기

  • 뷰 모델은 위와 같은 생명주기를 가지고 있기 때문에 데이터의 소멸을 방지할 수 있다.
  • 뷰 모델은 Activity가 더 이상 사용하지 않는 상태인 onDestroy() 호출 이후 onCleared() 호출하여
    내부 데이터를 초기화하고 해제하게 된다.
  • 뷰 모델의 Scope(생명 주기의 범위)는 ViewModelProvider에 의해서 결정된다.

 

4. 뷰 모델의 프로세스

뷰 모델 프로세스

뷰 모델을 구현하기 위해서는 ViewModelProvider의 도움을 받아야 한다.

  1. 사용자가 ViewModelProvider를 통하여 ViewModel 인스턴스를 요청한다.
  2. ViewModelProvider 내부에서는 ViewModelStoreOwner를 참조하여 ViewModelStore를 가져온다.
  3. ViewModelStore에게 이미 생성(저장)된 ViewModel 인스턴스를 요청한다.
  4. 만약 ViewModelStore에 적하반 ViewModel 인스턴스를 가지고 있지 않다면, Factory를 통하여
    ViewModel 인스턴스를 생성한다.
  5. 생성한 ViewModel 인스턴스를 ViewModelStore에 저장하고 만들어진 ViewModel 인스턴스를
    클라이언트에게 반환한다.
  6. 만약 같은 ViewModel 인스턴스 요청이 들어온다면, 1~3번의 과정을 반복한다.

 

 

 

[참고 사이트]

728x90