[android] ViewModel(AAC)

황주완·2023년 4월 4일
1
post-thumbnail

ViewModel이 뭘까?

구글 개발자들이 Clean Architecture를 쉽게 구현 할 수 있도록 라이브러리모음(Android Architecture Components)을 만들었는데 그중 하나가 바로 ViewModel이다.

ViewModel은 class이며 수명 주기를 고려하여 UI 관련 데이터를 저장하고 관리하도록 설계되었다.
ViewModel class를 사용하면 화면 회전과 같이 구성을 변경할 때도 데이터를 유지할 수 있다.

그래서 ViewModel을 왜쓰는걸까?

결론적으로는 화면 회전과 같이 구성을 변경할때 데이터를 유지 시킬수 있다, 그러면 onSaveInstanceState()를 쓰면 되는거 아닌가? 데이터가 단순한 경우는 onSaveInstanceState() 메서드를 사용하여 onCreate()의 번들에서 데이터를 복원 할 수 있다 하지만 이 접근 방법은 직렬화했다가 다시 역직렬화할 수 있는 소량의 데이터에만 적합하다.
또 다른 문제는 UI컨트롤러가 반환하는 데 시간이 걸릴 수 있는 비동기 호출을 자주 해야한다는 점이다
UI 컨트롤러는 비동기 호출을 관리 해야하며 메모리 누구 가능성을 방지하기 위해 호출이 소멸된 후 시스템에서 호출을 정리해야한다

UI컨트롤러 로직에서 뷰 데이터 소유권을 분리하는 방법이 훨씬 쉽고 효율적이다

ViewModel의 수명 주기

ViewModel code


class MyViewModel : ViewModel() {

    override fun onCleared() {
        super.onCleared()
        //여기서 ViewModel 종료 시 메모리 해제 해야될것을 해체하자
        //ex) binding = null
    }
    
}

요기서 onCleared()함수는 onDestroy()함수가 실행되기 전에 먼저 실행되어 저장되어야 할 값을 저장 하거나 메모리 헤제 해야될 것을 해체 해야한다

Activity와 ViewModel을 연결 시키려면...

class MainActivity : AppCompatActivity() {

   private lateinit var simpleViewModel: SimpleViewModel

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

       simpleViewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(SimpleViewModel::class.java)
   }
}

ViewModelProvider는 ViewModel과 Activity를 연결 시키는 역할을 한다

  1. ViewModelProvider를 통해 ViewModel 인스턴스를 요청
  2. ViewModelProvider 내부에서는 ViewModelStoreOwner를 참조하여
  3. ViewModelStore를 가져옴
  4. ViewModelStore에게 이미 생성된 ViewModel 인스턴스를 요청
  5. 만약 ViewModelStore가 필요한 ViewModel 인스턴스를 가지고 있지 않다면 Factory를 통해 ViewModel 인스턴스 생성
  6. 생성한 ViewModel 인스턴스를 ViewModelStore에 저장하고 ViewModel 인스턴스를 클라이언트에게 반환

주의할점!!

ViewModel에는 View, Fragment, Activity에 대한 Context를 저장해서는 안된다
ViewModel의 생명주기는 Activity에 종속되지 않기 때문에 이미 destroy된 component로 인해 메모리 릭이 발생 할수 도 있다

*appApplication Context를 저장하는 것은 문제가 안된다.

profile
Hello New World

0개의 댓글