MVP (Model View Presenter)
기본 정보
- 명칭: MVP
- 영문명: Model-View-Presenter
- 분류: UI 아키텍처 패턴
- 주요 용도: UI와 비즈니스 로직 분리
- 관련 주제: #MVP #Architecture #UI #Frontend
개요
MVP(Model-View-Presenter)는 사용자 인터페이스(UI)와 비즈니스 로직을 분리하기 위한 아키텍처 패턴이다.
MVC의 발전형 패턴 중 하나로, Controller 대신 Presenter가 View와 Model 사이를 중재한다.
특히 Android 앱 개발, WinForms, WPF, Flutter 초기 구조, 데스크톱 프로그램 등에서 많이 사용되었다.
MVP 구조
사용자
↓
View
↕
Presenter
↕
Model
↕
Database
MVC와 가장 큰 차이점은 View가 Model을 직접 알지 못하고, Presenter를 통해서만 통신한다는 점이다.
구성 요소
Model
데이터와 비즈니스 로직을 담당한다.
역할
- 데이터 조회
- 데이터 저장
- API 호출
- DB 처리
- 비즈니스 규칙 수행
예시
class UserModel {
public function getUser($id){
}
}
View
사용자에게 보여지는 화면을 담당한다.
역할
- 화면 표시
- 사용자 입력 수집
- Presenter 호출
예시
<button>
로그인
</button>
View는 로직을 거의 가지지 않는다.
Presenter
MVP의 핵심이다.
역할
- 사용자 이벤트 처리
- Model 호출
- View 업데이트
- 비즈니스 흐름 제어
예시
class LoginPresenter {
public function login(){
}
}
동작 과정
사용자 클릭
↓
View
↓
Presenter
↓
Model
↓
DB
↓
Model
↓
Presenter
↓
View 갱신
로그인 예시
로그인 버튼 클릭
↓
LoginView
↓
LoginPresenter
↓
UserModel
↓
DB 조회
↓
Presenter
↓
성공 메시지
↓
View
MVC와 비교
MVC
Controller
↓
Model
↓
View
Controller가 요청을 처리한다.
MVP
View
↓
Presenter
↓
Model
Presenter가 View와 Model 사이를 모두 관리한다.
MVC와 MVP 차이
| MVC | MVP |
|---|---|
| Controller 사용 | Presenter 사용 |
| View가 Model을 알 수 있음 | View는 Model을 모름 |
| View 의존성 존재 | Presenter 중심 |
| 웹 개발에 적합 | UI 중심 앱에 적합 |
| 테스트가 상대적으로 어려움 | 테스트가 쉬움 |
게시판 예시
글 목록
BoardView
↓
BoardPresenter
↓
BoardModel
↓
DB 조회
↓
Presenter
↓
View 출력
글 작성
BoardView
↓
BoardPresenter
↓
BoardModel
↓
INSERT
↓
결과 반환
↓
View 갱신
폴더 구조 예시
app/
├── Models/
├── Views/
├── Presenters/
├── Services/
└── Config/
Flutter 예시
UI Widget
↓
Presenter
↓
Repository
↓
API
Flutter 초창기에는 MVP 패턴이 자주 사용되었다.
Android 예시
Activity
↓
Presenter
↓
Model
MVP는 Android 개발에서 매우 유명한 패턴이었다.
장점
- UI와 로직 완전 분리
- 테스트 용이
- 유지보수 편리
- Presenter 재사용 가능
- View가 단순해짐
- 역할이 명확함
단점
- Presenter 수 증가
- 코드량 증가
- 소규모 프로젝트에는 과할 수 있음
- View 인터페이스 작성 필요
MVP와 MVVM 비교
| MVP | MVVM |
|---|---|
| Presenter | ViewModel |
| 수동 업데이트 | 데이터 바인딩 |
| 구현 단순 | 자동 동기화 |
| 테스트 쉬움 | 테스트 쉬움 |
| 코드 많음 | 프레임워크 의존 |
실무 메모
실무에서는 다음과 같은 방식이 권장된다.
- View는 최대한 로직 제거
- Presenter는 화면 흐름만 관리
- 비즈니스 로직은 Model 또는 Service 이동
- Presenter 비대화 방지
- 인터페이스 기반 설계
- 의존성 주입(DI) 적용
- 테스트 코드 작성
- Repository 패턴과 결합
- API 호출 로직 분리
- 화면별 Presenter 분리
MVP와 함께 사용하는 기술
- MVC
- MVVM
- Flutter
- Android
- PySide6
- Repository Pattern
- Dependency Injection
- Clean Architecture
- Service Layer
- UI
관련 문서
- MVC
- MVVM
- Flutter
- PySide6
- Repository Pattern
- Dependency Injection
- Clean Architecture
- Service Layer
- UI
- Architecture
출처
- Martin Fowler - Model View Presenter
- Microsoft Learn
- Android Architecture Guide
메모
- MVP와 MVC 비교 문서 작성 권장
- MVP와 MVVM 비교 문서 작성 가능
- Flutter MVP 템플릿 문서 작성 가능
- PySide6 MVP 예제 작성 가능
- TreeView CMS MVC 리팩토링 우선 추천
- MVC, MVVM, Clean Architecture와 상호 링크 추천