정의
모델-뷰-프리젠터(Model-View-Presenter, MVP)는 사용자 인터페이스(UI) 개발을 위한 구조적 디자인 패턴 중 하나로, 애플리케이션을 모델(Model), 뷰(View), 프리젠터(Presenter)의 세 구성 요소로 분리한다. 모델은 데이터와 비즈니스 로직을 담당하고, 뷰는 사용자에게 정보를 표시하는 UI 요소를 담당한다. 프리젠터는 모델과 뷰 사이의 중재자 역할을 수행하여, 사용자 입력을 모델에 전달하고 모델의 상태 변화를 뷰에 반영한다.
역사·어원
MVP 패턴은 1990년대 후반에 마이크로소프트의 윈도우 폼(Windows Forms) 및 .NET 프레임워크 환경에서 개발된 프레젠테이션 모델(Presentation Model) 개념을 확장한 형태로 등장하였다. “Model‑View‑Presenter”라는 명칭은 각각의 역할을 직관적으로 나타내는 영어 단어를 조합한 것이다.
구성 요소와 역할
| 구성 요소 | 주요 책임 |
|---|---|
| 모델 (Model) | 비즈니스 로직, 데이터 구조, 데이터 검증, 영속성 관리 등. UI와 무관하게 동작한다. |
| 뷰 (View) | 화면 요소(버튼, 텍스트 박스 등)와 레이아웃을 정의한다. 프리젠터에게 직접적인 로직을 전달하지 않는다. |
| 프리젠터 (Presenter) | 뷰와 모델을 연결한다. 사용자의 입력 이벤트를 받아 모델에 전달하고, 모델의 업데이트를 뷰에 반영한다. 뷰에 대한 의존성을 인터페이스 형태로 선언해 테스트가 용이하도록 설계한다. |
동작 흐름
- 사용자가 UI(뷰)에서 입력을 발생시킨다.
- 뷰는 해당 이벤트를 프리젠터에 전달한다(보통 인터페이스 메서드 호출).
- 프리젠터는 입력을 검증하고, 필요 시 모델에 작업을 요청한다.
- 모델이 상태를 변경하면, 프리젠터는 변경된 데이터를 뷰에 전달한다.
- 뷰는 전달받은 데이터를 사용해 화면을 갱신한다.
주요 특징 및 장점
- 관심사의 명확한 분리: UI 로직과 비즈니스 로직이 독립적으로 존재하므로 유지보수가 용이하다.
- 테스트 용이성: 프리젠터는 UI 프레임워크에 직접 의존하지 않으므로 단위 테스트가 쉬워진다.
- 플랫폼 독립성: 뷰를 교체하거나 다른 UI 프레임워크(예: Android, iOS, 웹)로 옮길 때 프리젠터와 모델은 그대로 재사용 가능하다.
단점 및 고려 사항
- 복잡도 증가: 작은 규모의 UI에서는 MVP 구조가 오히려 과도한 설계가 될 수 있다.
- 중복 코드: 프리젠터와 뷰 사이에 인터페이스 정의가 필요해 초기 개발 작업이 늘어날 수 있다.
주요 적용 사례 및 언어 지원
- Android: Google의 Android 개발 가이드에서 MVP를 권장하며, Kotlin·Java 기반 구현 예제가 풍부하다.
- .NET: WinForms, WPF, Xamarin.Forms 등에서 MVP가 사용된다.
- JavaScript/TypeScript: 웹 프레임워크(예: Angular, React와 결합된 MVP 구현)에서도 적용 사례가 있다.
관련 패턴
- MVC (Model-View-Controller): 프리젠터가 컨트롤러와 유사하지만, MVP에서는 뷰가 프리젠터에 대해 더 강하게 의존하고, 프리젠터가 뷰를 직접 조작한다는 점에서 차이가 있다.
- MVVM (Model-View-ViewModel): 데이터 바인딩을 중심으로 설계된 패턴으로, UI 프레임워크가 바인딩 메커니즘을 제공할 때 주로 사용된다.
요약
모델-뷰-프리젠터는 UI 애플리케이션의 구조를 명확히 분리하여 유지보수성과 테스트 가능성을 높이는 디자인 패턴이다. 특히 복잡하고 확장성이 요구되는 프로젝트에서 모델과 UI 로직을 독립적으로 관리하고자 할 때 효과적으로 활용된다.