[iOS][DesignPatterns] MVC 패턴

Uno·2021년 6월 27일
0

iOS 디자인패턴

목록 보기
3/5

Problem


Q. 제가 iOS 프로그래밍을 하는데, 어디다가 제가 코드를 짜야할 지 모르겠어요...

A. 코드를 짤 때, 어떤 기준으로 코드를 적어야할 지 모르시겠다는 거죠? 그러면, 공식문서에도 언급하고 있는 MVC 패턴을 따라서 작성하시면 됩니다!

Solution


Q. MVC 패턴이 뭔가요?

A. 그림을 먼저 보겠습니다.

그림을 보시면 3 개의 직사각형으로 나눠져있죠.

그리고 각각 이렇게 적혀있습니다.

  • Model
  • View
  • (View)Controller

각각의 앞글자를 따서 MVC 라고 부릅니다.

3 개로 나눈 이유는 각각의 역할에 따라 나눠진것입니다.

Q. Model은 뭔가요?

A. Model은 데이터를 "저장하는 틀" 입니다. 보통은 구조체를 사용하고 class를 사용할 수도 있습니다.

Q. View는 뭔가요?

A. View는 스크린에 있는 컨트롤이나 UI요소들을 보여주는 역할을 합니다. iOS에서 UIView를 서브클래싱한 객체들을 의미하죠.

Q. Controller는 뭔가요?

A. 모델과 뷰 사이에서 연결해주는 역할을 합니다. iOS에서 UIviewController 혹은 이를 서브클래싱한 객체가 예시가 되겠습니다.

Q. 그런데 왜 MVC를 사용하나요?

A. 애플이 UIKit을 만들 때, MVC를 채택했습니다. 그러다보니 기본이 되는 디자인패턴 되겠습니다. 구체적으로 보자면,

Controller는 모델과 뷰에 대해서 직접적으로 맞닿아 있습니다. 컨트롤러는 하나 이상의 모델과 하나 이상의 뷰를 가질수도 있습니다.

이와 반대로 모델과 뷰는 서로 참조를 하지 않습니다. 무조건 컨트롤러를 통해서만 소통하죠.

모델은 프로퍼티 옵저빙을 통해서 컨트롤러와 소통합니다. 그리고 뷰는 IBAction을 통해서 컨트롤러와 소통하죠.

(이후에 자세히 알아보겠습니다.)

Q. MVC에 단점은 있나요?

A. MVC는 컨트롤러 하나하나가 상당히 많은 테스크를 수행합니다. 그렇다는 건, 한번 컨트롤러를 만들고 재활용하기 힘들다는 말입니다. 왜냐하면 컨트롤러 하나하나가 개성이 강하니까요. 그런 점이 MVC의 단점이라고 할 수 있죠. 바로 "재사용성" 이 낮다는 점입니다. 또 각각의 역할을 나누다보면, 3 가지로 완벽하게 나누기 힘든 부분이 존재합니다. 그러다보면 보통 말하는 "Massive Controller" 라는 단점이 발생하구요. 결론적으로 MVC 를 보완할 만한 다른 패턴을 추가하는 것이 보통입니다.

Q. 그러면 언제 사용해야하나요?

A. 프로젝트 파일을 최초에 생성하면 MVC로 하도록 구성되어 있습니다. 물론 커스터마이징을 거치면 다른 패턴을 섞을 수 있습니다. 즉, 빠르게 무언가 구성하거나 로직이 단순하고 재사용성을 고려할 필요가 낮은 앱 혹은 기능이라면 MVC로 해도 무방하겠죠.

Q. 그런데 MVC가 디자인 패턴인가요?

A. MVC는 정확히 말하면 디자인 패턴이 아닌 구조적 패턴이 맞습니다. 다만, 디자인 패턴으로 혼용해서 커뮤니케이션 하곤 합니다.

Q. 구조적패턴이요? 그게 뭔가요?

A. 3 종류의 패턴에 대해서 잠시 설명드리자면,

  • 구조적 패턴 (Structural Patterns) : 어떻게 시스템을 구성할까? 를 고민하는 패턴입니다.
  • 행위적 패턴 (Behavior Patterns) : 어떻게 각 객채들이 소통할 수 있게 할까? 를 고민하는 패턴입니다.
  • 생성적 패턴 (Creation Patterns) : 어떻게 생성할까? 를 고민하는 패턴입니다.

MVC는 어떻게 구성할까에 해댕하기 때문에, 구조적 패턴에 해당합니다.

MVC 패턴에 대해서 짧게 알아봤습니다.

이후 다른 패턴에 대해서도 알아보겠습니다.

참고자료)

https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/3-model-view-controller-pattern#toc-chapter-007-anchor-001

profile
iOS & Flutter

0개의 댓글