article thumbnail image
Published 2023. 3. 22. 11:21

아키텍쳐 패턴의 핵심은 "관심사의 분리(SoC)"이다.

"관심사의 분리"에 대해 잘 이해가 가지 않는다면 해당 포스팅을 참고 바란다.

 

[Architecture Pattern] SoftWare Architecture

아키텍처(Architecture)란 위키피디아에 따르면 "소프트웨어의 구성요소들 사이에서 유기적 관계를 표현하고 소프트웨어의 설계와 업그레이드를 통제하는 지침과 원칙"을 의미한다. 말이 어렵지만

seokyoungg.tistory.com

UI Logic과 Buiness Logic은 특성도 다르고

UI Logic의 경우 자주 바뀌기 때문에 변경 주기도 다르다. 

따라서,  UI Logic과 Business Logic을 분리하기 위함이 MVC 패턴의 탄생 배경이다. 

 

 

MVC Architecture Pattern

MVC(Model-View Controller)는 

UI Logic과 Buisness Logic을 분리하고, 이들을 연결해주는 Layer로 구성된다. 

  • Model : 데이터 관련 로직과 비즈니스 로직을 담당
  • View : UI관련 로직을 담당
  • Controller : Model과 View를 연결한다. (어떻게 화면에 표시할지)

 

기존의 MVC패턴은 Model의 변화를 직접 View가 감지할 수 있는 구조였다. 

즉, View와 Model이 서로 의존성이 존재하는 결합도가 높은 구조이다.

 

 

Cocoa MVC Architecture Pattern

Apple 에서는 View와 Model을 분리한 Apple's(Cocoa) MVC를 통해 재사용성을 높였다.

 

Cocoa MVC 패턴은 View와 Model을 분리하여,

View와 Model은 서로 직접 소통하지 않고 Controller를 통해 소통하게 된다. 

또한, Controller에는 Model에 구현하기 애매한 Buisness Logic을 구현한다.

 

View - Controller

Controller는 outlet을 통해 View에 직접적으로 접근할 수 있다.

class ViewController: UIViewController { // Controller
    @IBOutlet weak var tableView: UITableView!  // View
    ...
}

반면, View는 Controller에게 "delegate"를 통해 행위에 대한 요청과 

"data source"를 통해 데이터에 대한 요청을 할 수 있다.

즉, Protocol을 통해 DIP를 적용하여,

View는 Controller를 직접적으로 알지 못하는 구조이다.

대표적인 예시로 UITableViewUITableViewDataSource, UITableViewDelegate가 있다.

 

또한, View-Controller는 

View의 action에 대한 target을 Controller에 구현하여,

View에서 발생한 action에 대한 처리를 Controller에서 처리한다. 

예를 들어 UITextField에서 작성을 완료하고 UIButton을 클릭하게 되면, 

클릭 Ac

 

Model - Controller

Controller는 Model에 직접 접근할 수 있다. 

반면, Model은 Notification & KVO를 통해 모델의 변화를 Controller에게 알린다.

 

 

UIKit Framework

UIKit Framework는 tvOS, iPadOs, iOS의 앱을 위한 Framework이다.

우리가 흔히 UITableView, UIViewController 등을 사용하기 위해서 import를 해줘야 한다.

 

이름에서 알 수 있듯이, UIKit은 User Interface와 관련된 것을 제공하고, 이벤트 처리를 제공한다.

이러한 기능들은 Core Object를 통해 제공이 되는데, 

Core Object도 MVC Pattern을 따른다.

 

UIKit 자체에서도 MVC 패턴이기 때문에,

접근성도 쉽고 애플에서도 앱 개발을 할 때 권장하는 패턴이다.

 

 

Pros & Cons

Pros

가장 첫번째로 UI Logic(View)과 Buisness Logic(Model)을 분리하여, 

Buisness Logic의 Test가 용이하다.

또한, UIKit도 MVC 패턴을 따르고 있고, 애플이 권장하는 패턴이기에 접근성이 좋다. 

마지막으로 간단한 패턴이기에 사용하기 쉽고, 빠르게 개발을 해야 할 때 유용하다.

Cons

Swift에서 ViewController는 View와 Controller가 너무 밀접하게 연관되어 있다.

Controller가 View의 Life Cycle까지 관리하기 때문에, 이 둘을 분리하기는 어렵다.

View와 Controller를 분리하기 어렵다는 것은

이는 재사용성이 떨어진다. 

 

두번째는 Controller만 테스트 하기 어렵다는 것이다. 

Business Logic을 소유하고 있는 Model은 분리되어 있지만,

Business Logic을 트리거하는 시작점인 Controller는

View와 밀접하게 연관되었기 때문에 Test하기 어렵다. 

예를 들어, 결제 버튼이 눌렸을 때, 제대로 사용자의 계좌를 조회하는지 확인해보고 싶다고 해보자.

이를 위해선 결제 버튼이 눌렸을 때, 해당 기능이 수행해야 되는지 체크해야 하지만,

이는 View를 띄우지 않고는 쉽지 않는 일이다.

 

마지막으로, ViewController는 Controller의 역할만이 아닌, 

View의 Life Cycle관리, Layout 등과 같이 View의 일부 기능도 떠맡게 된다.

이는 ViewController의 코드가 길어지게 되며,

이러한 의미에서 MVC를 Massive-View-Controller라고 하기도 한다.

 

Reference

위키피디아 

Apple Documentation

 

https://medium.com/ios-os-x-development/ios-architecture-patterns-ecba4c38de52

'iOS > Pattern' 카테고리의 다른 글

[Design Pattern] Coordinator 패턴  (0) 2024.05.26
[Architecture Pattern] MVVM  (0) 2023.05.27
[Architecture Pattern] SoftWare Architecture  (0) 2023.05.24
[Design Pattern] DI(Dependency Injection)  (0) 2023.05.08
[Architecture Pattern] MVP  (0) 2023.03.24
복사했습니다!