본문 바로가기
iOS/Swift

Swift) MVC

by Jiseong 2022. 2. 12.

 

MVC

애플의 MVC를 알아보기 전, 전통적인 MVC에 대해 먼저 알아보겠습니다.

Traditional MVC

이전 글에서 다룬 Distribution(역할 분배)가 전통적인 MVC에선 적용이 되지않은 모습입니다.

위의 다이어그램을 통해 전통적인 MVC는 Model, View, Controller가 서로 의존하고 있음을 알 수 있습니다.

 

View는 사용자 액션을 Controller에게 전달하고, Controller는 이에 따른 업데이트를 Model에게 요청합니다. 그 후 Model은 값을 업데이트한 후 값의 변화를 View에게 알립니다. 

 

이렇게 연결된 M, V, C는 서로의 존재를 잘 알고있고, 상호간의 의존성이 높습니다. 즉, 독립성이 현저히 떨어져 각각의 재사용성이 떨어집니다. 

 

독립성이 떨어졌다고 재사용성이 왜 떨어지냐?

 

우린 객체 각각의 역할, 책임을 할당하고, 서로에 대한 의존성을 떨어뜨리는 것을 독립성을 높인다 라고 합니다.

 

우린 특정 객체의 상태만 변화 시켜주고싶은데, 객체간의 의존성이 높다면 우리가 원치않는 객체의 상태 또한 변화시킬 수 있고, 원치않는 변화는 곧 오류, 그것도 어디서 발생한지도 찾기 힘든 오류가 발생하는 것입니다. 

 

이런 결과가 발생한다면 당연히 재사용성이 현저히 떨어지겠죠.

 

그래서 애플에서는 새로운 MVC를 제시하였습니다.

Apple's MVC (Cocoa MVC)

Cocoa MVC에선 Controller가 View와 Model이 서로 알지 못하게 사이에서 중재자 역할을 합니다.
이로써 View와 Model의 독립성이 보장되는 것으로 보입니다.

Cocoa MVC 패턴에서 Controller의 역할은 UIViewController가 담당합니다.
그 UIViewController는 View와 Controller를 모두 소유하게 되고, View의 LifeCycle과 의존성이 높아집니다.

분리되어 있다고 보기 어려운 것이죠.

그러므로 View와 Controller의 분리가 쉽지않으며 Controller의 재사용이 어려워지고, 같이 소유하는 View의 재사용 또한 어려워집니다.

 

View와 Controller가 연결되어 있으니 각각의 테스팅도 굉장히 힘들어지고, View를 통해 일어나는 사용자 액션에 따른 메소드와 변화하는 프로퍼티 그리고 UIViewController에서 일어나는 많은 행위가 Controller에만 담겨짐으로써 Controller가 방대해져 Massive View Controller라고 불리기도 합니다. 

 

그래서 실제 다이어그램은 밑과 같은 흐름을 갖게됩니다.

import UIKit

struct Person { // Model
    let firstName: String
    let lastName: String
}

class GreetingViewController : UIViewController { // View + Controller
    var person: Person!
    let showGreetingButton = UIButton()
    let greetingLabel = UILabel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.showGreetingButton.addTarget(self, action: "didTapButton:", forControlEvents: .TouchUpInside)
    }
    
    func didTapButton(button: UIButton) {
        let greeting = "Hello" + " " + self.person.firstName + " " + self.person.lastName
        self.greetingLabel.text = greeting
        
    }
    // layout code goes here
}
// Assembling of MVC
let model = Person(firstName: "David", lastName: "Blaine")
let view = GreetingViewController()
view.person = model;

위의 예제만 봐도 View의 액션을 담당하는 메소드와 액션에 따른 업데이트를 하는 Controller의 메소드 또한 Controller에 포함되어 있습니다. 

즉, View와 Controller가 밀접히 연결되어 있다는 것을 볼 수 있습니다.

 

Distribution - View와 Model은 확실히 분리되어 있습니다. 하지만 View와 Controller는 밀접히 연결되어 있습니다.

Testability - Model만 테스트를 할 수 있을 것입니다. 왜냐하면 View와 Controller는 분리가 되어있지 않기때문입니다.

Ease of Use - 다른 패턴들중 가장 적은 코드를 사용하므로, 접근성이 좋아 경험이 없는 개발자도 쉽게 유지보수할 수 있습니다.

 

Cocoa MVC is the best architectural pattern in terms of the speed of the development.

 

 

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

Swift) TDD  (0) 2022.02.12
Swift) UIViewController Life Cycle  (0) 2022.02.12
왜 디자인 패턴을 중요시 여기는가?  (0) 2022.02.12
Swift) Struct vs Class  (0) 2022.02.12
Swift) Notification, NotificationCenter  (0) 2022.02.12

댓글