ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - MVC, MVVP with RxSwift
    Ray Wenderlich/RxSwift 2020. 2. 29. 22:14


    MVC

    RxSwift는 MVVM과 엄청난 하모니를 자랑한다.


    애플에서는 MVC를 주로 사용하여 훌륭한 시스템을 구축했다.


    둘의 차이를 간략하게 알아보자.

    둘은 굉장히 가까운 사촌관계라고 볼 수도 있다. 하지만 그 둘은 분명히 다르다.


    이 책에서 대부분의 예제를 MVC로 설명했다. MVC는 굉장히 직관적이고 간단한 앱을 만들 때 굉장히 유용하다.

    Controller는 모델과 뷰를 업데이트할 수 있는 중심역할을 하고,

    View는 데이터를 화면에 표현해주는 역할

    Model은 데이터를 Read/Write하며 저장하는 역할을 했다.


    MVC가 초반에는 앱을 만드는데 꽤나 좋은 패턴이다. 

    하지만 앱의 규모가 커질수록 많은 클래스들이 뷰도 모델도 아닌 상황이 발생한다. 자연스레 이런 애들은 컨트롤러로 때려박는다.

    우리가 흔히 범하는 실수가 바로 하나의 컨트롤러에 너무 많은 코드를 집어넣게 되는 것이다.


    사실 우리가 앱을 만들 때, 하나의 ViewController가 메인으로 주어진다. 그래서 우린 너무나도 쉽게 이 ViewController에 코드를 추가하게 된다.

    그래서 MVC가 Massive View Controller라는 조크도 있다.


    이를 해결할 수 있는 디자인패턴 <MVVM>

    MVVM은 MVC와 유사하지만 좀 더 좋게 느껴질 수 있다. MVC를 좋아하는 사람은 대부분 MVVM을 좋아한다.

    MVVM을 사용하면 MVC에서 겪었던 불편한 점들을 해결할 수 있다.


    MVC와 다른점은 우선 VM이라는 View Model이 생겼다는 것이다.


    ViewModel이 뷰와 모델 사이에서 중심 역할을 하고 있다.

    비즈니스 로직을 처리하여 모델과 뷰에 전달한다.


    MVVM은 아래 간단한 규칙을 따른다.

    - Model은 다른 클래스에 직접적으로 접근하지 않는다. (데이터 변경 Notification을 발생시키기도 하지만 직접접근하지 않음)

    - View Model은 모델에 접근하여 데이터를 ViewController에 전달해준다.

    - View ControllerView ModelView에만 접근한다. View의 라이프사이클을 담당하고, UI요소를 데이터와 바인딩 해주어야 한다.

    - ViewView Controller에 이벤트를 전달한다. (MVC와 동일)


    음.. 이거 그냥 MVC아닌가요?? 네...니요 (yes....and no)


    이전에 언급했던 것처럼, ViewController에는 View를 제어하는 코드가 아닌 다른 코드들이 쌓여가고 있었다.

    MVVM은 이를 해결하기 위해 ViewControllerView와 묶어서 View의 역할만 하도록 하였다.


    MVVM의 또 다른 장점은 향상된 테스터빌리티이다. 걍 테스트하기 쉽다는뜻

    비즈니스 로직이 View의 라이프 사이클로부터 완전히 분리되었기 때문에, 비즈니스 로직 테스트가 훨씬 용이한 것이다.


    마지막으로, 뷰모델이 표현층(Presentation layer)으로 부터 완전히 분리되었기 때문에, 코드 재사용이 용이해졌다.

    앱 플랫폼을 변경하여도 재사용이 쉽게 가능한 것이다. (macOS <-> iOS)


    What goes where?

    오해하지말자. View Model에 코드를 다 때려박으면 어차피 Massive해지는 똑같은 상황이 발생한다.

    코드에서 책임을 나누어 잘 분산시키는 것은 여러분에게 달렸다.

    View Model을 데이터와 스크린 사이의 Brain으로 생각하자.


    그리고 네트워킹, 네비게이션, 캐싱 등의 역할은 별도의 클래스로 만들어 ViewModel으로부터 분리시키자.


    하나의 View Model에서 다른 View Model로 input을 전달하여(View Modelinit을 사용하여) 코드를 분산시키는 모습이다.



    하지만 진짜 코드 양의 감소가 유일한 장점일까??

    노노노


    - ViewController는 좀 더 심플해지고, 이름 그대로 View를 Control하는 역할에 집중할 수 있게 된다. RxSwift/RxCocoa는 UI를 데이터에 바인딩하는 것이 핵심이기 때문에 MVVM과 무척이나 잘 어울린다. 

    - ViewModel은 명확한 Input-Output패턴을 따른다. 따라서 테스트하기가 쉽다.

    - Mock모델을 사용하여 ViewController를 테스트하기가 더 쉬워진다. (근데 이건 잘몰겠음 ㅋㅋ MVC도 Mock Model로 편하게 했던거같은데)


Designed by Tistory.