Nuke Olaf - Log Store
MVP 패턴과 안드로이드 본문
1. MVP 의 뜻
Model : 모형, 모델 (애플리케이션에서 다루게 되는 데이터들을 의미한다)
View : 견해, 시야, 관점 (데이터들을 보여주는 방식을 의미한다)
Presenter : 진행자, 발표자 (View 에서 받은 사용자의 행동을 기반으로 Model 로직을 호출하거나, Model 의 로직을 기반으로 나온 결과를 View 에 보내 UI 의 변경을 야기한다)
소프트웨어 엔지니어링에서 말하는 MVP
MVP 패턴이란, 시각적인 것(View)과 데이터(Model)를 완전히 분리하고, 이 둘이 Presenter에 의해서만 상호작용할 수 있도록 하는 디자인 패턴이다.
‘MVP 패턴’은 Model, View, Presenter의 앞글자를 따서 이름이 지어졌다. 이 패턴의 핵심 아이디어는 사용자 인터페이스(View)와 비즈니스 로직(Model)을 분리하고, 서로간의 상호작용을 다른 객체(Presenter)에 위임해 서로의 영향을 최소화하는 것에 있다. 각 파트의 자세한 설명을 살펴보면 아래와 같다.
- Model : 내부적으로 쓰이는 데이터를 저장하고, 처리하는 역할을 한다. 흔히 ‘비즈니스 로직’ 이라고 부르는 부분이다. View, Presenter등 다른 어떤 요소에도 의존적이지 않은 독립적인 영역이다.
- View : 사용자 인터페이스(User Interface-UI)라 불리는 영역이다. 안드로이드에서는 Activity, Fragment가 대표적인 예이다. Model에서 처리된 데이터를 Presenter를 통해 받아서 사용자에게 보여주며, 사용자 액션 및 Activity lifecycle 변화를 감지해서 Presenter에 보내는 역할을 한다. Presenter를 이용해 데이터를 주고받기 때문에 Presenter에 의존적이다.
- Presenter : Model과 View사이의 매개체이다. View에서 캐치한 유저 액션을 전달 받아서 Model의 로직을 호출하거나, Model의 로직으로부터 나온 결과를 전달 받아서 View에 보내 UI변경을 야기하는 등 둘 사이의 소통의 역할을 한다. Model, View 모두에 의존적이다.
‘MVP패턴’을 이용해서 이와 같이 Model과 View간의 결합도를 낮추면, 새로운 기능을 추가하거나 변경할 필요가 있을 때 관련된 부분만 수정하면 되기 때문에 확장성이 좋아지며, 테스트 코드를 작성하기 편리해지기 때문에 더 안전한 코드 작업이 가능해진다.
2. MVP란 무엇인가?
MVP 패턴은 MVC 패턴에서 파생된 디자인 패턴이다. View 와 Model 이 서로 의존적인 MVC 패턴의 단점을 보완하기 위해 노력에 의해 만들어졌다. MVP 패턴에는 Controller 대신 Presenter 가 존재한다는 것이 MVC 패턴과의 차이점이라고 할 수 있다. Model 과 View 는 각각 Presenter 하고만 상호 동작을 하게 된다. 항상 Presenter 를 거쳐서만 동작하는 것이다. 그래서 View 와 Model 은 서로를 알 필요가 전혀 없다. Presenter 만 알면 된다. 그로 인해 MVC 의 단점이었던 View 와 Model 의 의존성이 없어지게 되는 것이다.
MVP 는 View 와 Model 을 완전히 분리해서 사용하기 위해 만들어진 디자인 패턴이다. 그래서 Model 의 역할인 비즈니스 로직을 독립적으로 테스트할 수 있다는 특징이 있다.
3. 안드로이드와 MVP
안드로이드에서 UI를 표현하는 컴포넌트들의 특징은 화면을 시각적으로 직접 그리는 역할 및 화면에 있는 UI 요소들에 대한 액션 처리를 항상 함께 담당한다는 것이다. 이러한 프레임워크의 특징 때문에 기존에 웹 어플리케이션 등에서 많이 쓰이던 MVC(Model, View, Controller)패턴을 적용하기에는 화면을 그리는 View와 액션을 처리하는 Controller를 완전히 분리하기 어렵다는 한계가 있다. 이러한 이유때문에, MVP가 안드로이드에 더 적합하다는 논의가 이어져오고 있다.
안드로이드를 개발한 구글 측에서도 Android architecture blueprints 라는 이름으로 MVP 패턴을 적용한 샘플 프로젝트를 공식적으로 운영하는 것으로 보아, 이 패턴은 안드로이드에 더 적절한 것으로 어느정도 검증되었다고 볼 수 있다.
4. 안드로이드에서 MVP 패턴을 사용하는 방법
간단한 두 숫자를 더하는 앱을 MVP 패턴을 이용하여 만들어 본다.
이 앱에서 MVP 의 각 역할은 다음과 같다.
View : 액티비티(Activity) 화면 구성 및 인터페이스 제공
Presenter : 1. 두 수의 계산 및 데이터를 저장합니다. 2.모델에 데이터를 전송하여 저장하는데 도움을 준다
Model : 데이터를 저장
1. View
실제 View 에 대한 직접적인 접근을 담당한다. 안드로이드에서 액티비티와 프래그먼트는 View 의 일부로 정의한다. View 에서 발생하는 이벤트를 View가 직접 핸들링 할 수 있지만, 모두 Presenter 에 위임한다. 액티비티가 view 인터페이스를 구현해서 Presenter 에서 코드를 만들 인터페이스를 갖도록 하면 된다. 이렇게 하면 특정 뷰와 결합되지 않고 가상 뷰를 구현해서 간단한 유닛 테스트를 할 수 있다.
Presenter 에서 호출할 수 있도록 View 의 Interface 를 갖게 한다. Presenter 를 생성하여 Interface 로 View 와 Presenter 가 통신할 수 있게한다
public class MainActivity extends Activity implements MainConstants.View {
// 입력한 숫자를 더하고 결과를 저장하는
// mainPresenter 객체 생성
MainConstants.Presenter mainPresenter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// mainPresenter 객체 초기화
mainPresenter = new MainPresenter();
initListener();
}
// = 버튼을 클릭했을 때 작동할 리스너를 초기화하는 메서드
private void initListener(){
String inputA = ((EditText)findViewById(R.id.editInputA)).getString().toString();
String inputB = ((EditText)findViewById(R.id.editInputB)).getString().toString();
// '=' 버튼 클릭 시 덧셈 결과 받기
findViewById(R.id.btnResult).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mainPresenter.addNums(inputA, inputB);
}
});
}
// MainConstants.View 인터페이스를 구현
// 계산 결과를 보여주는 TextView 에서 보여주는 코드를 작성
@Override
public void showResult(int result){
((TextView)findViewById(R.id.txtResult)).setText(Integer.toString(result));
}
}
2. Presenter
본질적으로는 MVC의 컨트롤러와 같지만, 뷰에 연결되는 것이 아니라 인터페이스로 연결된다는 점이 다르다. 이에 따라 MVC가 가진 테스트 가능성 문제와 함께 모듈화/유연성 문제 역시 해결한다. 프리젠터(Presenter)의 역할을 한줄로 표현한다면 "뷰(View)와 모델(Model) 사이에서 자료 전달 역할을 하는 것"이라고 할 수 있다.
View 의 통신을 위해서 Interface을 갖고 있으며, Model을 직접적으로 연결한다. Presenter에서 UI 작업은 View의 Interface을 통해서 표시한다. 데이터 저장, 삽입, 등 비즈니스 로직이 필요 시 Model을 호출하여 작업한다.
public interface MainConstants {
interface View{
// View 에 계산한 결과를 표시
void showResult(int result);
}
interface Presenter{
// View에서 입력한 두 수에 대한 덧셈
void addNums(int input1, int input2);
// 데이터 저장
void saveData(int data);
}
}
public class MainPresenter implements MainConstants.Presenter {
MainConstants.View mainView;
MainModel mainModel;
public MainPresenter(MainConstants.View view){
// View 연결
mainView = view;
// Model 연결
mainModel = new MainModel(this);
}
@Override
public void addNums(int input1, int input2) {
mainView.showResult(input1 + input2);
}
@Override
public void saveData(int data) {
mainModel.saveData(data);
}
}
3. Model
The model is an interface defining the data to be displayed or otherwise acted upon in the user interface.
앱 데이터 및 상태에 대한 비지니스 로직을 수행한다.
* 비즈니스 로직(Business logic)은 컴퓨터 프로그램의 규칙에 따라 데이터를 생성·표시·저장·변경하는 부분을 말한다. 데이터베이스, 표시장치 등 프로그램의 다른 부분과 대조되는 개념으로 쓰인다.
비즈니스 로직만 구성된다. Presenter에 저장된 데이터를 호출하여 전송 및 데이터를 저장하는 기능을 하게 된다.
public class MainModel {
MainConstants.Presenter presenter;
public MainModel(MainConstants.Presenter presenter){
this.presenter = presenter;
}
// Presenter 에서 데이터 저장 시 호출됩니다
// 자세한 저장 로직은 생략했습니다
public void saveData(int data){
//Todo..SaveData
}
}
참고 사이트 >>>
https://medium.com/cr8resume/make-you-hand-dirty-with-mvp-model-view-presenter-eab5b5c16e42
https://magi82.github.io/android-mvc-mvp-mvvm/
https://faith-developer.tistory.com/71
https://beomseok95.tistory.com/212
https://brunch.co.kr/@oemilk/75
https://www.mobiinside.co.kr/2017/12/22/buzzvil-android-mvp/
'ComputerScience > [디자인 패턴]' 카테고리의 다른 글
[MVP] 안드로이드에 mvp 패턴 적용하기(2) - Contract 작성 (0) | 2020.03.10 |
---|---|
[MVP] 안드로이드에 mvp 패턴 적용하기(1) - mvp 패턴이란? (0) | 2020.03.10 |
디자인 패턴, MVC 패턴, MVP 패턴 요약 정리 (0) | 2020.03.04 |
디자인 패턴이란? (0) | 2020.03.03 |
MVC 디자인 패턴 (0) | 2020.03.02 |