MVP-Pattern-Android

MVP Pattern 이란 MVC 아키텍처 패턴에서 파생된 것으로 User Interface를 작성하는데 사용된다. MVP는 (Model-View-Presenter)의 약자이다. 기존에 작성했던 소스를 예시로 MVP Pattern의 예시를 들어보려고 한다. 소스코드는 링크를 첨부한다. source

MVP Pattern flow

flow

위의 그림을 토대로 설명을 해보겠다.

View

MVP Pattern에서 View란 activity 혹은 Fragment 에서 사용자가 보고있는 화면을 의미한다. View를 보는 사용자는 굳이 내부에서 실행 될 로직이나, 변수에는 전혀 의존성 없이 할 행동만 있으면 된다.

Presenter

Presenter 란 View와 Model 사이를 연결해주는 곳이다. View에서 User의 Action이 들어오면 데이터에 의존성이 있다면 데이터를 수정하고 없다면 데이터를 수정 하지 않는다. User Action 에 맞는 Method를 실행하고 View에 모든 명령을 다 처리 한 후 사용자에게 보여질 View를 udpate 해준다.

Model

Model 이란 사용자 저장되어 있는 정보가 필요 할 때 사용한다. 예를 들면 사람 정보를 저장한다고 하면, 사람에 관한 데이터를 DB로 저장하던지 Local 변수로 저장 할 것이다.

Simple source

이 소스는 View에서 사용자의 입력을 받아 Model(user) 에 이름을 저장하는 간단한 예제이다.

Presenter

Presenter 부터 살펴보자. Presenter 는 Model과 View 모두 연결 되있다. Presenter에 View라는 interface를 만들어두고 View에서 Presenter.View를 implements 하는 것으로 View에서 rendering 될 View에대한 Method를 override할 의무를 준다. updateName 은 View에서 사용자가 요청할 Method이고 요청이 들어오면 Model에 데이터를 저장하고 View에 update를 요청한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MainPresenter {
private User user;
private View view;
public MainPresenter(View view) {
this.view = view;
user = new User();
}
public void updateName(String name) {
user.setName(name);
view.updateUserInfoTextView(user.toString());
}
public interface View {
void updateUserInfoTextView(String info);
}
}

Model

Model 에서는 사용자가 필요한 정보를 저장할 class가 필요하다

1
2
3
4
5
6
7
8
9
10
11
12
13
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Name : " + name;
}
}

View

View 에서는 Presenter의 View를 implements받아 View에서 사용해야 하는 Method를 override 한다. onCreate시 presenter를 등록 해 주고, 사용자의 행동은 Presenter로 보내준다. 여기에서는 text가 변경 될 때 Presenter에 사용자의 행동을 보낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class MainActivity extends AppCompatActivity implements MainPresenter.View{
private MainPresenter mainPresenter;
private TextView userInfoTextView;
private EditText name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainPresenter = new MainPresenter(this);
userInfoTextView = (TextView) findViewById(R.id.userInfo);
name = (EditText) findViewById(R.id.name);
name.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mainPresenter.updateName(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public void updateUserInfoTextView(String info) {
userInfoTextView.setText(info);
}
}

MVP-Pattern 후기

  • 사용자 입장과 개발자 입장을 나누어서 볼 수 있다는 점이 편한 것 같다.

  • 다른 여러 디자인 패턴에 대한 정보도 궁금하다.