MVP Architecture
MVP
는 Model과 View, Presenter로 나누는 패턴이다. MVC와 비교하여 View와 Model이 서로 존재를 몰라 의존성이 줄어든다. 이말은 쉽게 View와 Model 클래스를 변경, 수정할 수 있고 MVC에 비해 Model 클래스의 유닛 테스트를 쉽게 시도할 수 있다.
- Model
- Local DB, Remote DB, sharedPreference .. 등 데이터를 수정, 관리하는 Class
- Presenter
- 사용자의 액션을 받아 로직을 처리하고, Model에게 Data 변경을 요청하거나 UI 업데이트하는 로직을 처리하는 Class
- ViewContract : View and Presenter의 설계
- 사용자 액션을 Presetner에 떠넘기고, UI 업데이트하는 코드만 있는 클래스
interface AccountContract {
interface View{
public void showText();
}
interface Presenter {
public void clickButton();
}
}
Google Architecture에 따르면 Contract
는 View와 Presenter 서로 소통하는 인터페이스를 정의합니다. 위 AccoutContact로 View와 Presenter 예제를 봅시다.
View 정의하기
class AccountActivity implements AccountCountact, View.OnClickListener{
private AccountPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_account);
presenter = new AccountPresenter(this);
initView();
}
private void initView() {
Button refreshBtn = view.findViewById(R.id.refresh_btn);
refreshBtn.setOnClickListener(this);
}
//Presenter에게 onClick 위임
@Override
public void onClick(View view) {
presenter.clickButton();
}
@Override
public void showText() {
Toast.makeText(this, getString(R.string.account_message), Toast.LENGTH_SHORT).show();
}
}
Contract에서 정의한 View interface를 구현하는 AccountActivity를 생성합니다.View
는 화면에 UI를 그리는 기능만 수행하고 사용자 행동으로 인한 액션은 Contract를 통해 Presenter로 넘깁니다.
그러기 위해 멤버 변수로 Presenter 객체를 가집니다.
Presenter 정의하기
Contract에서 정의한 Presenter interface를 구현합니다.Presenter
는 사용자 액션을 View로 부터 넘겨받아 Model Data 변경을 요청하거나, UI 업데이트 로직을 수행하는 class입니다. 그러기 위해 멤버 변수로 View 객체와 Model 객체를 가집니다.
class AccountPresenter implements AccountContract.Presenter {
private AccountContact.View accountView;
private AccountModel model;
AccountPresenter(AccountContract.View accountView, AccountModel model) {
this.accountView = accountView;
this.model = model;
}
@Override
public void clickButton() {
model.update();
accountView.showText();
}
}
정리하며
MVP 패턴을 구현하다보니 지난 게시글의 MVC와 매우 유사하다고 생각이 든다. 그래서 과연 내가 MVC를 맞게 구현했던 것일까라는 의문이 생긴다. 그래도 MVP를 사용함으로서 Contract 또는 Presenter로 인터페이스를 정의하는 방식을 배우게 되었고 View가 Presenter에게 독립적으로 존재할 수 있다는 것을 느끼게 되었다.
참고
'Android > Common' 카테고리의 다른 글
[Android] 뷰의 성능 개선 - 오버드로 줄이기 (3) | 2020.10.08 |
---|---|
[Android] Drawable color 속성을 코드로 변경하기 (0) | 2020.08.24 |
[Android] Executor - 기능 별 Thread 분리 (0) | 2020.07.17 |
[Android] MVC 적용하기 (0) | 2020.07.07 |
[Android] 내부 DB - Room (0) | 2020.06.03 |