MVP(Model-View-Presenter) 톺아보기

suojae·2023년 11월 25일
0

[iOS] 아키텍쳐

목록 보기
4/11


세 가지 형태의 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계층에서 ViewController 사이에 Interactor라는 계층을 설정하여 Interactor에 입력에 따라 데이터를 변경할 이벤트를 맵핑했다.

  • 이 때 ControllerPresenter라는 이름으로 변경했는데 이는 앞선 Taligent 개발환경에서는 위젯단위의 컨트롤러가 존재하지 않았기 때문!

  • 대신 Presenter라는 컴포넌트가 Main혹은 EventLoop처럼 다른 요소들을 중개했다

  • View는 MVC와 마찬가지로 데이터를 화면에 출력


MVP의 확장 - 클라이언트/서버

  • 마이크포텔은 MVP 구조를 클라이언트와 서버구조로까지 확장시키고자 했다

  • 이때 서버는 Commands, Selections, Model을 소유하고, 클라이언트는 View, Interactor를 소유했다

  • 동작원리는 아래와 같다

  1. 입력이 발생하면 Client Side: View -> Interactor -> Presenter 로 전달
  2. Server Side: 클라로부터 SQL등을 Presenter로 전달받고 Commands-> Selections -> Model에 변경이 일어나면 클라쪽 뷰에서 모델의 변화를 옵저버 패턴으로 감시

Taligent MVP는 왜 주류가 되지 못했나?

  • 지나친 계층의 분리
    -> 적절한 단위로 계층을 나누지 않으면 직관성을 저해한다
    -> 심지어 확장버전에서는 모델, 뷰간 통신을 위한 surrogateproxy같은 모델 계층까지 추가
    -> 애플리케이션 대규모화에 염두를 두고 한 일이지만 이정도 세분화 필요한 애플리케이션은 많지 않았다

-> 결국 중요한 것은 많은 사람들이 공감할 수 있는 수준의 계층분리


Supervising Controller

Twisting the Triad(MVC를 60도 비틀기)

  • 고전적인 MVC(왼쪽)에서 Aplication Model(Presentation Model)을 제거하고 ControllerPresenter로 대체하고 있는 것을 확인할 수 있다
  • 그리고 presentation model 패턴에서 끊겼던 모델과 뷰사이의 관계가 복원되었다

  • 앞서 애플리케이션 모델 패턴에는 뷰는 화면을 표시하는 역할만을 담당했지만 슈퍼바이징 컨트롤러에서는 입력과 출력을 모두 담당하게 되었다.

  • 컨트롤러를 대체한 프리젠터가 프레젠테이션 로직까지 가져오게되었다

  • 이렇게 모델은 순수하게 도메인 로직만 담을 수 있게 되었다


Supervising Controller 정리

  • 유저의 입력이 발생하면 이벤트를 프리젠터에 위임한다
  • 프리젠터는 이벤트가 프레젠테이션 로직이면 자체적으로 처리하여 뷰를 갱신한다
  • 비즈니스 로직의 처리가 필요하면 적절한 커맨드를 모델에 보낸다
  • 대체적으로 뷰는 프리젠터를 경유하여 모델을 갱신하지만 원한다면 뷰가 직접 모델을 조작할 수 있다.
  • 슈퍼바이징 컨트롤러의 특징은 Observer동기화와 Flow동기화를 함께 쓴다는 것
profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글