Passive View - 옵저버 동기화를 포기한 뷰 (MVP Pattern-TDD)

suojae·2023년 11월 25일
0

[iOS] 아키텍쳐

목록 보기
8/11


TelligentView/SupervisingController VS PassiveView

  • 앞서 텔리전트나 슈퍼바이징 컨트롤러에서는 모델과 뷰가 옵저버 바인딩을 통해 데이터를 갱신하고 있었다.
  • 하지만 패시브 뷰는 이러한 모델과 뷰 사이의 옵저버 바인딩을 제거하고 모델과 뷰 사이의 관계를 없애버렸다.
  • 모든 데이터 동기화를 프레젠터에 의해 Flow Sync(플로우 동기화)로 수행되도록 변경했습니다
  • 뷰는 더이상 프레젠테이션 로직을 자체적으로 처리하지 않는다
  • 따라서 뷰는 모든 상태와 로직을 프레젠터에게 추출당해 오직 UI갱신과 관련된 수동적인 역할만 담당하게 되었다

Passivew View를 통한 Testable 코드 작성

  • MVP의 패시브뷰는 초기 MVC의 문제점으로 지목되었던 테스트 코드 작성의 어려움을 해결하려는 아키텍쳐입니다.
  • 따라서 Passive View에 대해서 생각할 때는 당시에 TDD가 유행하고 있었다는 배경을 염두해두어야 합니다

Michael Feathers의 The Humble Dialog Box

  • 마이클 프리더스는 먼저 스마트 오브젝트(Presenter)와 뷰의 인터페이스를 만들고 뷰를 스마트 오브젝트에 주입하는 방식 강추
  • 이러한 인터페이스를 활용해 테스트 시에는 가짜 뷰라고 할 수 있는 MockView 활용을 권장한다. (실제뷰는 일반적으로 테스트가 어렵기 때문)
  • 다음으로 실제 다이얼로그 박스를 구현하는데 이때 다이얼로그의 제스처들, 어떤 이벤트라고 할 수 있는 것들은 전부 스마트 오브젝트에 위임할 것을 권장합니다
  • 위와 같이 이벤트에 대한 처리를 모두 SmartObject에 위임하면 SmartObject가 다이얼로그 박스에 해야하는 작업은 마치 setter를 이용해서 값을 갱신하는 것 이외에는 없어지게 된다.

정리

+----------------+       +---------------+       +----------------+
|                |       |               |       |                |
|     Model      |       |   Presenter   |       |     View       |
| (Data/Logic)   | <---- | (Business     | <---- | (User Interface|
|                |       |  Logic & View |       |  - Passive,    |
|                |       |  Interaction) |       |  displays data |
+----------------+       +---------------+       |  only)         |
                                   ^             +----------------+
                                   |
                                   |
                                   v
                          +----------------+
                          |                |
                          |  User Inputs   |
                          | (e.g., button  |
                          |  clicks, etc.) |
                          +----------------+
  • 스마트오브젝트(프리젠터)에는 모든 이벤트를 처리하는 작업들을 기술한다
  • 뷰는 UI와 UI에 필요한 값을 갱신하는 역할만 담당한다
  • 마틴파울러좌: 패시브 뷰에서는 사용자의 입력에 따라 발생한 이벤트의 처리뿐 아니라 뷰를 갱신하는 명령까지 뷰에서 제거한다, 이렇게 함으로써 컨트롤러를 테스트할 때 뷰로 인해 발생하는 테스트의 어려움을 최소화할 수 있다
  • 즉 테스트시에 컨트롤러가 UI프레임워크의 영향에서 벗어날 수 있어야한다!


기억할 것! 뷰를 테스트하는 것은 어렵기 때문에 뷰는 단순히 사용자 이벤트가 거쳐가는 공간이자 표시할 데이터에 대한 getter/setter만 제공해야하는 공간이 되어야한다!

프레젠테이션과 다른 것을 연결할 시에는 직접참조하기 보다는 중간계층을 만들어라!

profile
Hi 👋🏻 I'm an iOS Developer who loves to read🤓

0개의 댓글