MVC 패턴이란?

  • Model-View-Controller (MVC) 패턴은 세 가지 타입의 object로 나누어져 있습니다.
  • 세 가지 object는 다음 그림과 같이 결합되어 있습니다.

1. Model

  • Model은 앱의 데이터를 포함하고 있습니다.
  • 대부분 struct나 간단한 class로 구성되어 있습니다.

2. View

  • View에서는 스크린에서의 시각적 요소나 컨트롤들을 표시합니다.
  • 대부분 UIView의 하위 클래스로 구성되어 있습니다.

3. Controller

  • Controllermodelview 사이에서 조정(coordinate)하는 역할을 합니다.
  • 대부분 UIViewController의 하위 클래스로 구성되어 있습니다.

추가 설명

  • MVC 패턴은 iOS 프로그래밍에서 익숙하게 볼 수 있습니다.
  • Apple이 UIKit에서 채택한 디자인 패턴이기 때문입니다.

  • Controller는 하나 이상의 model 혹은 view를 포함할 수 있습니다.

  • Controller에서는 modelview에 대해 strong property를 소유할 수 있습니다.
  • 즉, controller에서 직접 접근이 가능합니다.

  • 반대로, modelview에서는 (그들이) 속해있는 controller에 직접 접근할 수 없습니다. (strong reference를 포함할 수 없습니다.)
  • 이렇게 되면 retain cycle이 발생할 수 있습니다.

  • Model에서는 property observing를 통해서 controller와 소통(communicate)합니다.
  • View에서는 IBAction을 통해서 controller와 소통(communicate)합니다.

  • 결과적으로, modelview들은 controller들 사이에서 재사용됩니다.
  • Controller들은 각각의 task에 따라 logic이 구분되어 있기 때문에 재사용되기 어렵습니다. (MVC에서는 재사용하지 않습니다.)

주의: View에서는 delegate를 통해서 (그들이) 속해있는 controller의 weak reference를 사용할 수도 있습니다. 
예를 들어, UITableView는 delegate나 dataSource reference를 통해 view controller의 weak reference를 포함하고 있을 수도 있습니다.
하지만, 테이블 뷰는 그 reference들이 (속해있는) controller를 가리키고 있는 것인지 알지 못합니다.

언제 MVC 패턴이 사용될까?

  • iOS 앱을 처음 만들 때 starting point로 MVC 패턴을 사용하면 좋습니다.
  • MVC 패턴이 아닌 추가적인 패턴들이 필요하다고 느껴질 때, 앱에 다른 패턴을 사용하면 됩니다.

MVC 패턴을 사용할 때 주의해야 할 점

  • MVC 패턴에도 한계가 존재합니다.
  • 모든 object들이 model, view, controller에 딱 맞게 구분되지는 않습니다.
  • 결과적으로, MVC 패턴만 사용한 앱은 controller에 너무 많은 logic들이 포함되게 됩니다.
  • 즉, View Controller가 복잡해지고, 거대해지게 됩니다.
  • 이러한 현상을 방지하기 위해서 다른 디자인 패턴도 함께 활용해줘야 합니다.

Key Points

  • MVC 패턴은 model, view, controller로 나누어져 있습니다.
  • MVC 패턴은 modelviewcontroller에서 재사용할 수 있습니다.
    • 단, controller는 각각의 logic이 구체적으로 정해져 있으므로, 재사용하지 않습니다.
  • controllermodelview 사이에서 조정(coordinate)하는 역할을 합니다.
    • model의 데이터 값을 view에 띄워주고, viewIBAction 콜을 처리합니다.
  • MVC 패턴으로 iOS 앱을 시작하는 것은 좋지만, 한계도 있습니다.
    • 모든 object들이 model, view, controller로 깔끔하게 나누어 떨어지지는 않습니다.
    • 따라서, MVC 패턴과 다른 패턴들을 함께 활용하는 것을 권장합니다.

References

  • Design Patterns by Tutorials (raywenderlich)
  • Github 예제 link (commit: 79ec05e)