MVVM패턴이란?
MVVM 패턴은 코드의 가독성과 유지보수성을 향상시키기 위해 사용됩니다. 이 패턴은 UI와 비즈니스 로직을 분리하여 코드의 결합도를 낮추고, 테스트 가능성을 높입니다. 특히 안드로이드에서는 데이터 바인딩을 통해 MVVM 패턴을 효과적으로 구현할 수 있습니다.
MVVM패턴의 구성요소
View: 사용자에게 보여지는 UI를 담당합니다. Activity, Fragment, XML 레이아웃 파일 등이 이에 해당합니다.
ViewModel: View와 Model 사이의 중재자 역할을 하며, UI 관련 데이터를 준비하고 관리합니다. ViewModel은 생명 주기를 인식하여 View가 파괴되더라도 데이터를 유지합니다.
Model: 애플리케이션의 데이터와 비즈니스 로직을 담당합니다. 데이터베이스, 네트워크 통신, 데이터 처리를 포함합니다.
MVVM패턴의 적용예제
1. 프로젝트 설정
먼저, 데이터 바인딩을 활성화해야 합니다. 프로젝트의 build.gradle 파일에 다음을 추가합니다.
android {
...
dataBinding {
enabled = true
}
}
2. Model,View,ViewModel 설정
//Model
public class UserRepository {
private final String userData = "Hello, MVVM";
public String getUserData() {
return userData;
}
}
//ViewModel
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
public class UserViewModel extends ViewModel {
private final UserRepository userRepository = new UserRepository();
private final MutableLiveData<String> userData = new MutableLiveData<>();
public LiveData<String> getUserData() {
return userData;
}
public void fetchUserData() {
userData.setValue(userRepository.getUserData());
}
}
//View
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModelProvider;
import com.example.app.databinding.ActivityMainBinding;
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
private UserViewModel userViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
userViewModel = new ViewModelProvider(this).get(UserViewModel.class);
binding.setViewModel(userViewModel);
binding.setLifecycleOwner(this);
binding.buttonFetchData.setOnClickListener(v -> userViewModel.fetchUserData());
}
}
코드설명
Model 클래스: UserRepository
역할 : UserRepository 클래스는 데이터 소스 역할을 합니다. 여기서는 단순히 문자열 데이터를 반환하지만, 실제 애플리케이션에서는 데이터베이스나 네트워크 통신을 통해 데이터를 가져올 수 있습니다.
구현: getUserData() 메서드를 통해 데이터를 반환합니다.
ViewModel 클래스: UserViewModel
역할 : UserViewModel 클래스는 View와 Model 사이에서 중재자 역할을 합니다. UI 관련 데이터를 준비하고 관리합니다.
구현 : LiveData<String> getUserData() 메서드는 userData LiveData 객체를 반환하여 View에서 관찰할 수 있게 합니다.
fetchUserData() 메서드는 UserRepository의 데이터를 가져와 userData LiveData 객체에 설정합니다.
Activity 클래스: MainActivity
역할: MainActivity는 MVVM 패턴에서 View 역할을 합니다. 사용자 인터페이스를 정의하고, 사용자 입력을 처리합니다.
구현:데이터 바인딩을 사용하여 XML 레이아웃 파일과 연결합니다.
UserViewModel을 초기화하고, 이를 데이터 바인딩에 설정하여 ViewModel의 데이터를 관찰합니다.
버튼 클릭 이벤트를 설정하여 ViewModel의 fetchUserData() 메서드를 호출합니다.
LiveData, MutableLiveData란?
LiveData : 변경 가능한 데이터 홀더 클래스로, 수명 주기를 인식하는 방식으로 설계되었습니다. 즉, 액티비티나 프래그먼트가 활성 상태일 때만 옵저버가 데이터 변화를 관찰할 수 있습니다. LiveData 객체는 읽기 전용으로, 데이터를 변경할 수 없습니다.
MutableLiveData : LiveData의 서브클래스로 안드로이드 MVVM 패턴에서 중요한 역할을 합니다. 읽기와 쓰기가 모두 가능하고 데이터를 관찰 가능하게 만들어서 ViewModel에서 데이터의 변경을 확인하여 UI가 자동으로 업데이트되도록 합니다.
3. xml 설정
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.example.app.UserViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.userData}" />
<Button
android:id="@+id/buttonFetchData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fetch Data" />
</LinearLayout>
</layout>