ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AAC - ViewModel
    안드로이드 학습/Android 기술면접 대비 2024. 10. 7. 11:21

    안드로이드 JetPack의 내용들을 학습을 하면서 만나게 된 개념이 AAC의 ViewModel이다. 처음 안드로이드 신입시절 MVVM의 ViewModel을 학습하면서 AAC의 ViewModel의 학습한 것으로 착각을 했었다. 그래서 이번에 AAC의 ViewModel을 확실히 공부하고 넘어가보려고 한다. 

    1. AAC - ViewModel이란

    AAC - ViewModel은 데이터가 사라질수 있는 환경(Activity가 재생성 되는 상황)에서 데이터를 유지하기 위해 나왔다. Activity 재생성시 onCreate()가 다시 불러와지고 데이터베이스나 SharedPreference로 저장하지 않는 데이터들은 새롭게 초기화 되기 때문에 저장할 필요는 없지만 Activity 재생성시에만 유지 시킬 수 있는 방법이 필요했다. 

     

    안드로이드에서 Activity가 재생성 되는 상황 

    더보기
    • 화면 방향 전환 (가로/세로 전환): 이 경우 시스템이 액티비티를 재생성하여 새로운 방향에 맞는 레이아웃을 적용합니다.
    • 다른 구성 변경(Configuration Change): 예를 들어, 언어 변경, 키보드(소프트/하드) 상태 변경, 화면 크기 조정 등이 있을 때 액티비티가 재생성될 수 있습니다.
    • 메모리 부족으로 인해 앱이 강제로 종료된 후 다시 열릴 때: 시스템이 메모리를 확보하기 위해 백그라운드에 있는 앱을 종료할 수 있고, 이후 앱을 다시 열 때 onCreate가 호출됩니다.

     

    1-1 기존 데이터 유지 방법 및 문제점

     

    처음부터 ViewModel을 사용했던 것은 아니고 그전에는 onSaveInstanceState()와 onRestoreInstanceState() 사용했다.

     

    하지만 이 방법에는 문제점은 Bundle()을 사용하기 때문에 저장하는 데이터의 타입과 용량이 제한이 되어있었다. 공식 문서에는 50Kb 미만으로 유지하라는 가이드가 있다. (공식 문서 가이드)

     

    또한 이 방법에서 onSaveInstanceState()는 메인 쓰레드에서 동작해야하기 때문에 여기서 데이터를 저장하는데 시간을 많이 사용하게 되면 그만큼 UI에 버벅거림이 생길 수도 있다.

     

    onSaveInstanceState의 문제점 

    • 타입제한 (기본 데이터 타입(int, String 등)과 Parcelable 인터페이스를 구현한 객체만 가능
    • 용량제한 (50Kb 미만)
    • UX 안좋은 영향 (버벅임 > 메인쓰레드에서 동작해서)

    1-2 ViewModel 

     

    이러한 문제를 해결하기 위해서 나온 것이 바로 ViewModel 이다. ViewModel은 Activity의 onDestroy가 호출되더라도 소멸되지 않는다. Activity내에서 finish()를 직접 호출하거나 사용자가 액티비티를 닫을 때(백키를 누르거나 히스토리에서 제거할때) 소멸된다. Activity가 재성성 되었을 때도 유지하고 싶은 데이터는 ViewModel에 저장하면 된다. 그래서 ViewModel에는 주로 UI와 연관된 데이터를 주로 저장한다. 

    2. ViewModel 사용시 주의점

    • ViewModel 사용시 Activity와 Fragment나 Context를 참조해서는 안된다.
      • Activity가 종료되고 새로운 Activity가 생성되어도 ViewModel은 살아있기 때문에 종료된 Activity의 참조를 가지고 있다면 메모리 릭이 발생한다.
      • Application Context는 사용해도 된다. lifecycle의 차이 때문이다. 이런 경우 AndroidViewModel을 사용하면 된다.
      • 일시적이 아닌 데이터를 영구적으로 저장해야 한다면 Preference 또는 DataBase에 저장해야한다. 
    • Activity나 Fragment에 하나의 ViewModel만 사용하는 것을 권장한다.
      • 여러개의 ViewModel을 사용할 경우 ViewModel 별로 다른 데이터를 가지면 복잡해지기 때문에 하나만을 사용하는 것을 권장한다. 
    •  

    3. SavedStateHandle

    ViewModel이 완벽한 것은 아니다. 거의 일어나지 않는 일이지만 프로세스 종료시에는 데이터를 유지 못한다. 

     

    onSaveInstanceState()와 데이터베이스 혹은 SharedPreference에 저장한다면 프로세스 종료시에도 데이터가 유지될 수 있다. 하지만 이렇게 된다면 추가적인 코드가 필요하고 코드가 복잡해지기 때문에 이런 방식 대신 쓸수 있는 것이 있다. 

    그것은 SavedStateHandle이다.

     

    SavedStateHandle은 따로 예제를 만들어볼 마음이 없기 때문에 여기서 한번 훌터보기로 했다.

     

    3-1) 라이브러리 추가

    implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0'

     

     

    3-2) Activity

    MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class);

     

    3-3)  ViewModel

    public class MyViewModel extends ViewModel {
        private final SavedStateHandle savedStateHandle;
    
        public MyViewModel(SavedStateHandle savedStateHandle) {
            this.savedStateHandle = savedStateHandle;
        }
    
        // 예: count 값을 저장하거나 복원하기 위한 메서드
        public int getCount() {
            return savedStateHandle.get("count", 0); // 기본값은 0
        }
    
        public void setCount(int count) {
            savedStateHandle.set("count", count);
        }
    }

     

    4. AAC ViewModel vs MVVM ViewModel

    마지막으로 안드로이드 입문자가 헷갈릴 만한 개념인 AAC의 ViewModel과 MVVM의 ViewModel의 차이를 살펴보겠다. 

    나도 처음 학습 했을때는 둘이 동일한 개념이라고 생각하였으나 둘은 전혀 관계가 없는 다른 개념이다. 그러나 블로그에 있는 예제들을 보면 두 개념은 동시에 사용하기 때문에 더 헷갈릴수도 있다. 그래서 좀 더 알아보기로 했다. 

    MVVM의 ViewModel 

    MVVM은 Model, View, ViewModel를 사용하는 아키텍처 패턴이다. ViewModel은 View와 Model 사이에서 데이터를 관리해주고 바인딩 해주기 위한 class다. 

     

    이런식으로 구성요소를 나누는 이유는 애플리케이션의 로직과 UI를 분리시키고 이것은 코드의 가독성을 높이고, 유지보수를 용이하게 하는 등 여러 가지 이점을 제공하기 때문이다. 

    AAC ViewModel

    중복되는 내용이지만 간단히 얘기하자면, AAC에서의 ViewModel은 데이터를 보관하고 역할을 하기 위한 부분이다.

    안드로이드에서 화면 회전을 할 경우 생명주기가 다시 시작되는데 이때 AAC의 ViewModel을 사용하여 데이터를 보관하고 라이프사이클을 인식하여 Activity나 Fragement의 Destroy시 onClear 함수를 통한 데이터 해제의 역할을 한다. 

     

     

    간단하게 요약하자면,

     

    MVVM은 앱의 코드 관리나 유지보수 향상등을 위한 아키텍처 방법론중 하나이고

    AAC는 화면 좌우 전환등의 Activity가 새로 만들어 졌을때 데이터 보관을 위한 방법이다. 

Designed by Tistory.