타이탄의 도구들

[Android] ViewModel이란? 본문

Dev Tools/Android

[Android] ViewModel이란?

Titan04 2022. 6. 1. 15:23
728x90

Android ViewModel 이란?

ViewModel 은 Activity 나 Fragment 데이터를 준비하고 관리하는 클래스입니다.

또한 나머지 응용프로그램과의 통신 (예: 비즈니스 로직 클래스 호출)도 처리합니다.

비즈니스 로직이란?

데이터를 원하는 형태로 가공하는 눈에 보이지 않는 처리과정

ViewModel 은 항상 스코프(Activity 또는 Fragment)와 관련하여 생성되며

스코프가 활성 상태인 한 유지됩니다.

ex) Activity 인 경우 완료될 때까지. 즉, 구성 변경(예: 회전)으로 인해

ViewModel 소유자(Activity 나 Fragment)가 소멸되는 경우에도 ViewModel 이 소멸되지 않습니다.

새로 생성된 인스턴스가 기존 ViewModel에 다시 연결되는 것입니다.

ViewModel 의 목적은

Activity 또는 Fragment 에서 필요한 정보를 획득하고 유지하는 것입니다.

Activity 또는 Fragment 는 ViewModel 의 변화를

관찰(Observe)할 수 있어야 합니다.

ViewModels는 일반적으로 LiveData 또는 Android Data Binding 을 통해

이 정보를 노출합니다.

당신이 선호하는 프레임워크에서

observability construct(변화를 관찰할 수 있는 구조)를 사용할 수도 있습니다.

ViewModel 의 유일한 역할은 UI에 대한 데이터를 관리하는 것입니다.

View 계층에 접근하거나 Activity 또는 Fragment에 대한

참조를 하지 않아서는 안 됩니다.

(View 변경에 대한 코드는 View에서만)

Activity에서 일반적으로 사용되는 용도는 다음과 같습니다.

 public class UserActivity extends Activity {

            @Override
           protected void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
               setContentView(R.layout.user_activity_layout);
               final UserModel viewModel = new ViewModelProvider(this).get(UserModel.class);
               viewModel.getUser().observe(this, new Observer<User>() {
                    @Override
                   public void onChanged(@Nullable User data) {
                       // 여기서 UI를 업데이트합니다.
                   }
               });
               findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                    @Override
                   public void onClick(View v) {
                        viewModel.doAction();
                   }
               });
           }
       }

    ViewModel :
       public class UserModel extends ViewModel {
           private final MutableLiveData<User> userLiveData = new MutableLiveData<>();

           public LiveData<User> getUser() {
               return userLiveData;
           }

           public UserModel() {
           }

           void doAction() {
                // 여기서 작업에 따라 필요한 비즈니스 로직을 처리하고,
               // userLiveData 를 업데이트 합니다.
           }
       }

ViewModel은 하나의 Activity 안에 있는 여러 다른 Fragment 들 간의

통신 계층(communication layer)으로 사용될 수도 있습니다.

각 Fragment 는 Activity 를 통해 동일한 키를 사용하여

동일한 ViewModel 을 획득할 수 있습니다.

이렇게 하면 Fragments 간의 통신이 디커플 방식으로 이루어지므로

다른 Fragment 와 직접 통신할 필요가 없습니다. (fragment 간의 의존성이 약해짐)

예시) fragment1 <-> ViewModel <-> fragment2

  public class MyFragment extends Fragment {
       public void onStart() {
           UserModel userModel = new ViewModelProvider(requireActivity()).get(UserModel.class);
       }
   }

감사합니다 :)

728x90
Comments