[Android] ViewModel(AAC)

HEETAE HEO·2022년 5월 23일
0
post-thumbnail

이번 시간에는 ViewModel에 대해 공부한 내용을 작성하려고 합니다.

ViewModel

우선 ViewModel은 Android Architecture Component중 하나로 Android jetpack라이브러이 형태로 지원한다. ViewModel하면 떠오르는게 하나 있을 것입니다. 바로 MVVM패턴의 ViewModel입니다

그렇다면 AAC ViewModel과 MVVM ViewModel의 차이점은 무엇일까요?

MVVM ViewModel의 설명에 적혀있는 설명은 이렇습니다.
-> View와 Model 사이에서 데이터를 관리해주고 바인딩해주는 역할을 한다. 그렇기에 View는 ViewModel을 통해서만 데이터를 전달받을 수 있다.

반면 AAC ViewModel의 경우

etLifecycle().addObserver(new LifecycleEventObserver() {
    @Override
    public void onStateChanged(@NonNull LifecycleOwner source,
            @NonNull Lifecycle.Event event) {
        if (event == Lifecycle.Event.ON_DESTROY) {
            // Clear out the available context
            mContextAwareHelper.clearAvailableContext();
            // And clear the ViewModelStore
            if (!isChangingConfigurations()) {
                getViewModelStore().clear(); // ViewModelStore를 Clear
            }
        }
    }
});

AAC(Android Architecture Components)에는 5개의 라이브러리로 구성되어 있는 데 그 중하나가 ViewModel입니다. AAC의 ViewModel은 화면 회전이 일어나도 데이터를 보관하고 Activity에서는 LifecycleEventObserver()로 Fragment에서는 FragmentStateManager로 View의 Lifecycle을 지속적으로 observe하여 Activity/Fragment가 종료된다면(onDestroy).clear()을 통해 데이터를 해제하는 역할을 하는 것입니다.

지금까지 설명한 내용대로라면 ViewModel이라는 이름은 같지만 하는 역할이 다릅니다. 이름만 같은 뿐이지 하는 역할이 다르기 때문입니다. 하지만 ViewModel의 대해 공부하다보면 AAC의 ViewModel과 MVVM의 ViewModel이라고 설명하는 글도 존재하였습니다.

AAC의 ViewModel의 경우 단일 Activity 단일 ViewModel을 권장하고 MVVM의 ViewModel은 단일 View에 여러개의 ViewModel이 있어도 문제가 없습니다. 이러한 차이점이 존재하기 때문네 저의 생각은 두 ViewModel은 다른 ViewModel이라고 생각합니다.

그렇다면 MVVM패턴을 사용중에 AAC ViewModel을 사용하고 싶다면 어떠게 해야할까요? 바로 AAC ViewModel에 MVVM ViewModel의 역할을 넣는 것입니다. 이때 핵심적으로 사용하게되는 것이 LiveData입니다. LiveData를 통해 읽기만 하고 수정은 할 수 없는 데이터를 View에 던져주어 MVVM패턴에서의 ViewModel의 역할을 수행해준다면 데이터의 분리 뿐만 아니라 화면 회전에 대한 데이터보호 까지 사용이 가능한것이기 때문입니다.

왜 화면을 회전해도 데이터가 남아있을까?

그 이유는 Lifecycle이 Activity와는 다르기 때문입니다.

다음 이미지를 본다면 Activity의 경우 화면의 회전이 일어난다면 onDestroy되었다가 onCreate가 실행됩니다. 즉

화면이 생성되고 -> 데이터의 작성이 됨 -> 화면 회전 Event 발생 -> 화면이 삭제(onDestroy)됨-> 삭제된 화면이 생성이됨(onCreate)->작성된 데이터는 없어지고 새 화면이 생성

반면 AAC ViewModel의 생명주기는 화면이 완전히 종료가 되지않는다면(ScopeOwner가 Destroy되어지지않는다면) onCleared()가 발생하지 않습니다. 그렇기에 화면회전이 발생하여도 데이터의 손상이 없는 것입니다.

AAC ViewModel 사용시 주의사항

  1. ViewModel 내부에 Activity/Fragment/View의 Context를 저장하면 안됩니다.
    : ViewModel의 Lifecycle은 외부에 존재하기 때문에 Memory leak의 원인이 될 수 있습니다.
  2. ViewModel은 기기의 구성변경에만 유지
    : 구성변경, 화면회전 같은 상황에서만 유지가 되고 back이나 최근목록 앱 종료와 같은 강제적인 종료의 경우 데이터의 보존이 않됩니다.
  3. Main Activity의 ViewModel을 Sub Activity에서 사용하고 싶다면?
    : ViewModelProvider.Factory를 싱글톤(SingleTon)으로 ViewModel 구현
    해당 방법은 다른 생명주기에서 ViewModel객체를 유지하는 것이고 ViewModel인스턴스를 유지하는게 아닌 DataSource나 Repository를 싱글톤으로 공유하는 것이 더 효율적입니다
  4. 단일 Activity에서 여러 개의 Fragment들이 값을 공유할 때
    : Fragment에서 ViewModel을 생성 시 FragmentScope 대신 ActivityScope로 Activity의 ViewModel을 싱글톤처럼 서로 공유해서 사용
profile
Android 개발 잘하고 싶어요!!!

0개의 댓글