세 가지 형태의 MVP
1. Taligent MVP
- Taligndent의 CTO였던 Mike Potel이 MVC를 보다 세분화화한 아키텍처로 MVP를 제시했다
Model
, View
, Presenter
, Interactor
, Selections
, Commands
로 계층을 세분화했다
2. Supervising Controller
- Andy Bower와 Blair Mcglashan에 의해 정립
- 간단한 프레젠테이션 로직은 뷰에서 처리하고 복잡한 프레젠테이션 로직은
Presentation
이 처리한다
- 프레젠테이션 모델 패턴에서 끊겼던 모델과 뷰사이의 옵저버 패턴이 부활했다
(옵저버 패턴이 궁금하다면 이글로)
3. Passive View
- 로직을 배제하고 화면을 출력하는 소극적인(Passive)역할만 담당하는 뷰
- 옵저버 바인딩을 사용하지 않으며 모델과 뷰 사이 관계도 끊어짐
- TDD유행과 맞물려 보다 테스터블한 코드 작성에 중점
Taligent MVP
- Mike Potel은 기존의 MVC의
model
을 데이터 관리 계층으로, View
+ Controller
를 UI계층으로 일반화했다.
- 위와 같이 두 개 계층으로 일반화한 후 데이터 관리 계층과 UI관리 계층을 더 세분화 시켰다
- 우선 UI계층에서
View
와 Controller
사이에 Interactor
라는 계층을 설정하여 Interactor
에 입력에 따라 데이터를 변경할 이벤트를 맵핑했다.
-
이 때 Controller
를 Presenter
라는 이름으로 변경했는데 이는 앞선 Taligent 개발환경에서는 위젯단위의 컨트롤러가 존재하지 않았기 때문!
-
대신 Presenter
라는 컴포넌트가 Main
혹은 EventLoop
처럼 다른 요소들을 중개했다
-
View
는 MVC와 마찬가지로 데이터를 화면에 출력
MVP의 확장 - 클라이언트/서버
-
마이크포텔은 MVP 구조를 클라이언트와 서버구조로까지 확장시키고자 했다
-
이때 서버는 Commands, Selections, Model
을 소유하고, 클라이언트는 View
, Interactor
를 소유했다
-
동작원리는 아래와 같다
- 입력이 발생하면 Client Side: View -> Interactor -> Presenter 로 전달
- Server Side: 클라로부터 SQL등을 Presenter로 전달받고 Commands-> Selections -> Model에 변경이 일어나면 클라쪽 뷰에서 모델의 변화를 옵저버 패턴으로 감시
Taligent MVP는 왜 주류가 되지 못했나?
- 지나친 계층의 분리
-> 적절한 단위로 계층을 나누지 않으면 직관성을 저해한다
-> 심지어 확장버전에서는 모델, 뷰간 통신을 위한 surrogate
나 proxy
같은 모델 계층까지 추가
-> 애플리케이션 대규모화에 염두를 두고 한 일이지만 이정도 세분화 필요한 애플리케이션은 많지 않았다
-> 결국 중요한 것은 많은 사람들이 공감할 수 있는 수준의 계층분리
Supervising Controller
Twisting the Triad(MVC를 60도 비틀기)
- 고전적인 MVC(왼쪽)에서
Aplication Model(Presentation Model)
을 제거하고 Controller
를 Presenter
로 대체하고 있는 것을 확인할 수 있다
- 그리고 presentation model 패턴에서 끊겼던 모델과 뷰사이의 관계가 복원되었다
-
앞서 애플리케이션 모델 패턴에는 뷰는 화면을 표시하는 역할만을 담당했지만 슈퍼바이징 컨트롤러에서는 입력과 출력을 모두 담당하게 되었다.
-
컨트롤러를 대체한 프리젠터가 프레젠테이션 로직까지 가져오게되었다
-
이렇게 모델은 순수하게 도메인 로직만 담을 수 있게 되었다
Supervising Controller 정리
- 유저의 입력이 발생하면 이벤트를 프리젠터에 위임한다
- 프리젠터는 이벤트가 프레젠테이션 로직이면 자체적으로 처리하여 뷰를 갱신한다
- 비즈니스 로직의 처리가 필요하면 적절한 커맨드를 모델에 보낸다
- 대체적으로 뷰는 프리젠터를 경유하여 모델을 갱신하지만 원한다면 뷰가 직접 모델을 조작할 수 있다.
- 슈퍼바이징 컨트롤러의 특징은 Observer동기화와 Flow동기화를 함께 쓴다는 것