본문 바로가기

카테고리 없음

[안드로이드][자바] MVVM 패턴과 예제

반응형

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>

 

반응형