반응형

MVP 패턴이란?


 

Application의 시각적 요소와 그 뒤에서 돌아가는 Business Logic을 서로 영향 없이 쉽게 고칠 수 있도록 설계하는 방식이다.

MVP 패턴이라는 이름은 이러한 요소를 정의하는 Model, View, Presenter 3가지 구성 요소의 Abbreviation 이다.

이 3가지 구성 요소를 정리하면 다음과 같이 기술할 수 있다.

 

  • Model : Application의 데이터와 상태에서 대한 Business Logic 수행
  • View : 실제 View에 대한 직접적인 접근을 담당
  • Presenter : View와 Model 사이에서 데이터를 전달하는 역할

 

즉, MVP 패턴은 View와 Model이 Presenter를 통해서만 동작할 수 있도록 설계하기 때문에,

View와 Model의 의존성을 제거하는 디자인 패턴이라고 할 수 있다.

이를 그림을 통해서 정리하면 아래와 같다.

 

 

 

 

 

 

Android에서 MVP 패턴을 사용하는 이유는?


 

class MainActivity : AppCompactActivity() {

  @Override
  override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    // Control 역할을 하는 setOnClickLitener가 View 에서 발생하고 처리된다
    button.setOnClickListener {
        // 데이터 갱신 요청
        // Model에 접근해서 최신 데이터를 요청
        // ex) ArrayList<String>을 반환하는 getItems() 함수 호출,
        // getItems() 로 전달받은 ArrayList로 View를 갱신
    }
  }
}
 

위의 코드를 보면 알 수 있듯이, Android는 사실 Class 하나로 MVP의 처리가 가능한 구조로 만들 수 있다.

이런 식으로 코드를 작성하면 코드가 짧을 때는 구조를 파악하기 쉽다.

 

하지만 코드가 길어지고 한 Class 내부에서 처리해야 할 일이 많아지면 어떻게 될까?

그야말로 Class 하나가 가지고 있는 코드가 1,000줄을 넘어갈 수도 있게 되고, 가독성이 떨어지게 될 것이다.

또한, Class 내부에서 수행하는 Logic의 변경이 이루어지면 어느 부분을 수정해야 하는지 명확하지 않을 것이다.

 

정리하자면, MVP 패턴을 사용해서 Model, View, Presenter를 분리하면 다음과 같은 이점이 있을 수 있다.

 

  1. Business Logic을 Model, View, Presenter로 분리함으로써 명확한 업무 분담을 할 수 있다.
  2. Application이 담당하는 부분이 명확해짐으로써 코드의 유지보수성이 높아진다.

 

 

 

 

 

 

 

Contractor 란?


 

MVP 패턴에서 사용하는 Contractor는 Model, View, Presenter가 각각 어떤 역할을 분담할지 명시하는 계약(Contract)이라고 할 수 있다.

즉, Interface 하나를 작성하고 우리의 설계 패턴에서 각각의 요소들이 어떤 일을 할 지를 선언하는 것이다.

만약 View와 Presenter에서 특정한 역할을 지시하는 예시를 만든다면 다음과 같이 작성할 수 있을 것이다.

 

interface Contract {
    interface View {
        fun showInfo(info: JSONObject)  // Show info date at textview
    }

    interface Presenter {
        fun initInfo()  // when onCreate(), if saved data exist display it
        fun setInfo(info: JSONObject)   // Let view show info data at Textview
        fun saveInfo(info: JSONObject)  // Let model save info data from edittext
    }
}
반응형
복사했습니다!