[안드로이드] MVP 패턴 적용해보기 - View와 Presenter

J·2023년 3월 20일
1

안드로이드

목록 보기
25/29

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();
      	}
      }

0개의 댓글