본문 바로가기
개발/Android

[Android] ViewModel 정리

by 1인용 놀이터 2025. 2. 11.
728x90
반응형

ViewModel 이란 ?

ViewModel 클래스는 UI 관련 데이터를 저장하고 관리 하는 클래스.

UI에 상태를 노출하고 관련 비즈니스 로직을 캡슐화 함.

주요 이점은 상태를 캐시하여 구성 변경 (예:화면 회전) 에도 상태를 유지 한다는 것. 즉, Activity 간에 이동하거나 구성변경(예:화면 회전) 후에도 UI가 데이터를 다시 가져올 필요가 없음.

 

 

ViewModel 장점 ?

ViewModel은 Activity 또는 Fragment와 다른 LifeCycle을 가지게 된다.

Activity의 finished 메소드가 호출 됐을 때 onCleared 메소드를 통해 ViewModel이 소멸된다.

 

1. 지속성

  - ViewModel은 해당클래스가 보유하는 상태와 ViewModel이 트리거 하는 작업에서 모두 지속성 허용.

  - 이러한 캐싱을 통해 화면 회전과 같은 구성변경에서도 데이터 유지

 

2. LifeCycle 인식

  - ViewModel은 관찰하는 LifeCycle이 사라질 때까지 메모리에 남아 있다가 파괴 되는 시점에 자동으로 정리 됨.

 

3. UI Data 공유 

  - UI 관련 데이터를 저장하며, LiveData를 통해 UI 핸들링 클래스에 노출 됨.

  - Fragment 간의 데이터 공유 가능.

 

4. 비즈니스 로직에 액세스 가능

  - Activity나 Fragment가 직접 데이터를 처리하지 않고 ViewModel을 통해 데이터를 처리함으로써 UI와 비즈니스 로직이 분리 가능.

 

 

ViewModel 구현 ?

ViewModel 클래스를 상속받는 서브 클래스 정의

public class MainViewModel extends ViewModel {
	//.....
	//.....
}

 

서브 클래스 정의 후 Activity에서 ViewModel 에 접근 가능.

 

public class MainActivity extends AppCompatActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create a ViewModel the first time the system calls an activity's onCreate() method.
        // Re-created activities receive the same MyViewModel instance created by the first activity.
        MainViewModel model = new ViewModelProvider(this).get(MainViewModel.class);
    }
}

 

 

ViewModelProvider ?

ViewModelProvider의 첫 번째 인자는 ViewModelStoreOwner를 의미. 

이는 ViewModel의 저장소를 누가 소유 하고 있냐는 것을 의미함. Activity, Fragment 등이 이에 해당함.

 

ViewModelStore는 ViewModel들을 HashMap 형태로 저장하고 있어서, MainViewModel.class를 key값으로 사용해 ViewModel 객체를 가져온다.

이때 key에 해당하는 value가 없으면 생성하고 가져올 수 있어서 처음 ViewModel 객체를 만들어도 get을 통해 value를 가져올 수 있음.

728x90
반응형

'개발 > Android' 카테고리의 다른 글

[Android] Intent Filter 정리  (0) 2025.02.12
[Android] Intent(인텐트) 정리  (0) 2025.02.12
[Android] LiveData 정리  (0) 2025.02.11
[Android] 관찰자 패턴(Observer Pattern)  (0) 2025.02.11
[Android] Fragment 정리  (0) 2025.02.10