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를 분리하면 다음과 같은 이점이 있을 수 있다.
- Business Logic을 Model, View, Presenter로 분리함으로써 명확한 업무 분담을 할 수 있다.
- 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
}
}
'Mobile > Android' 카테고리의 다른 글
[Android/Kotlin] ViewModel 이란? (+ LiveData 포함) (0) | 2022.01.14 |
---|---|
[Android/Kotlin] MVP 패턴을 구현해보자! (실습) (0) | 2022.01.13 |
[Android] 안드로이드 스튜디오 유용한 단축키 (0) | 2021.01.01 |