Android (안드로이드)

[Android] 디자인 패턴 - MVP 패턴 / 예제

Oscar:) 2024. 2. 15. 13:04

 

 

이번엔 MVP 패턴에 대해 알아보자.

 

 

디자인 패턴이 뭔지 모르겠다면 아래 포스팅부터 보고 오면 도움이 될 것이다.

 

 

디자인 패턴 & MVC 패턴에 대한 포스팅이다.

 

[Android] 디자인 패턴 - MVC 패턴 / 예제

디자인 패턴 중 MVC 패턴에 대해 알아보자. 안드로이드에서 적용하는 MVC 패턴이다. 디자인 패턴이란? 소프트웨어의 개발 방식을 문서로 공식화 한 것. 개발 중 자주 나타나는 과제를 해결하기 위

oscarstory.tistory.com

 

 

 


 

MVP 패턴

 

 

MVC 패턴을 기반으로 생겨났으며,

Controller의 개념을 삭제하고 Presenter가 추가된 디자인 패턴이다.

 

Model + View + Presenter 의 약어로 MVP라 칭한다.

 

 

Presenter가 중개자 역할을 해주기 때문에

View와 Model을 확실하게 분리한 패턴이라고 볼 수 있다.

 

 

 

 

 

✅ Model

 

- 데이터와 비즈니스 로직을 주로 관리한다.

- Presenter 로부터 명령을 전달 받고 데이터의 상태를 변경시킨다.

- 데이터의 상태가 변경되면 다시 Presenter에게 알린다.

 

 

✅ View

 

- View · Layout 등 화면을 처리하는 곳이면서,

안드로이드의 경우 Activity · Fragament에 해당한다.

- 사용자 입력을 받고 Presenter에게 알린다.

- 업데이트 될 데이터를 Presenter에게 전달 받는다.

 

 

✅ Presenter

 

- View와 Model 사이에서 데이터를 전달하는 역할을 한다.

 

 

 


 

예제

 

 

레이아웃 파일은 따로 올리지 않는다.

 

 

✅ MainActivity.java

public class MainActivity extends AppCompatActivity {

    Presenter presenter;
    TextView textView;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvpactivity);

        presenter = new Presenter();
        textView = findViewById(R.id.textView);
        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            
                // Presenter 함수 호출하여 반환 값을 View에 업데이트
                textView.setText(presenter.getResult());
            }
        });

    }
}

 

 

MVC 패턴 예제와 마찬가지로,

버튼 클릭 시 텍스트 뷰의 텍스트가 바뀌는 간단한 예제다.

 

안드로이드에서의 MVP 패턴은 Activity가 View에 해당한다고 언급했었다.

그리고 View와 Model은 서로 존재를 알아서는 안 된다.

 

그렇기에 Activity(View)에서는 Presenter만을 참조하고 있다.

 

 

Presenter의 getResult() 메서드는 텍스트로 들어갈 String을 반환한다.

 

 


 

✅ Presenter.java

public class Presenter {

    Model model = new Model();

    public String getResult() {
        return model.choiceBreakfast();
    }

}

 

 

Presenter는 Model을 참조하고 있다.

 

View에서 호출한 getResult() 메서드 안에는 Model의 메서드를 호출했다.

 

위 메서드도 마찬가지로 String을 반환한다.

 

 


 

✅ Model.java

public class Model {

    String breakfast = "";

    public String choiceBreakfast() {

        Random random = new Random();
        int num = random.nextInt(5);

        switch (num) {

            case 0 : breakfast = "시리얼";
                break;

            ...

        }

        return breakfast;

    }
}

 

 

Model은 Presenter의 호출을 받아 간단한 랜덤 로직을 동작시키고

breakfast라는 데이터를 정제하여 반환하는 역할을 한다.

 

 


 

✅ 결과

 

 

 


 

 

✅ 정리

 

▶ View에서 사용자 입력을 받음

 

View에서 Presenter의 메서드 호출

 

Presenter에서 Model의 메서드 호출

 

Model에서 데이터 정제하여 Presenter로 반환

 

Presenter는 Model로부터 받은 데이터를 View로 반환

 

View는 Presenter로부터 받은 데이터로 UI 업데이트

 

 


 

MVP 패턴의 구조를 쉽게 이해시키고자 위 처럼 단순하게 예제를 만들었다.

 

 

더 근본적으로 사용하려면 View에서도 UI를 업데이트 시켜주는 메서드를 만들고,

Presenter에서 View를 참조하고 해당 메서드를 호출하여 데이터를 전달해야 한다.

 

MVP 패턴의 큰 특징 중 하나가 Presenter가 View와 Model 양쪽으로 의존성을 띄는 것이기 때문이다.

 

 

그래도 더 중요한 것은 View와 Model이 서로의 존재를 모른다는 것과,

그 사이에서 Presenter가 중개자 역할을 한다는 것이다.

 

그렇기에 View와 Model이 확실히 분리되었고,

이것이 MVC 패턴과의 가장 큰 차이점이다.

 

 

 

MVP 패턴의 단점이라고 언급할 만한 것이 있다면,

프로젝트가 커지면 Presenter가 너무 무거워진다는 것이다.

 

그렇기에 실제 프로젝트에 적용할 때는

Presenter의 역할을 한 눈에 파악할 수 있도록 Interface를 활용하곤 한다.

 

 

 


 

 

 

이번 포스팅에서는 MVP 패턴에 대해 알아보았다.

 

개인적으론 MVC 보다 깔끔하다고 느끼며

View와 Model이 확실히 분리되어서 유지·보수도 더 편하다고 생각한다.