디자인 패턴이란?
Software의 설계 방식이다. Software의 재사용성, 유지보수성을 높이기 위한 전략들이다.
디자인 패턴의 종류
Structural (구조): combining and composing objects
ex) MVC(Model-View-Controller), MVVM(Model-View-ViewModel), Facade
Behavioral (행위): communicating between objects
ex) Delegation, Strategy, Observer
Creational (생성): instantiating objects
ex) Builder, Singleton, Prototype
각각의 종류를 외우는 데에 초점을 두지 말고, 어떤 패턴이 어떤 때에 활용하면 좋은지를 비교 분석하는 것에 초점을 두자.
이 패턴들 중, iOS에서 가장 기본적인 패턴이 되는 것을 먼저 살펴보자.
MVC, Delegation, Strategy, Singleton
이 패턴들은 Apple's foundation과 UIKit frameworks에서도 자주 사용되고, 대부분의 iOS 앱에서도 사용되는 패턴들이다.
1. MVC(Model-View-Controller)
Models hold onto application data
They're usually structs or simple classes
Views display visual elements and controls on screen.
They're usually subclasses of UIView
Controllers coordinate between models and views.
They're usually subclasses of UIViewController
MVC 패턴은 iOS 프로그래밍에서 핵심적인데, Apple이 UIKit와 함께 선택한 패턴이기 때문이다.
좀 더 구체적으로 하나씩 살펴보자.
Controllers는 Model, View 프로퍼티를 가질 수 있고, 이 프로퍼티를 통해서 직접 접근할 수 있다.
(Controllers are allowed to have strong properties for their model and view, so they can access these directly.)
반대로, Models과 Views는 Controller에 대한 strong references를 가지면 안된다.
(should not hold strong references to their owning controller.)
This would cause a retain cycle.
*Retain Cycle이란?
Model / View가 Controller를 직접 소유하는 대신,
Models은 Property Observing을 통해 Controller와 소통하고
Views는 IBAction을 통해 Controller와 소통한다.
이로써 결국 Models, Views는 여러 개의 Controllers에서 사용할 수 있다.
(Controller는 특정 상황에 대한 로직이 구현되어 있기 때문에 재사용하기가 어렵다! MVC 패턴에서 상호관계만 봐도 그렇다.)
그럼 이 패턴을 언제 사용할까?
iOS APP의 시작점에서, 물론 다른 패턴과도 함께 사용할 수 있다.
실제 코드를 살펴보자.
*computed property (연산 프로퍼티) 란?
UIViewController 에서 addressView
Model, View를 모두 가지고 있는 Controller. Controller는 Model, View에 모두 직접 접근이 가능한 형태.
Model에 있는 값들을 View에 담아서 업데이트 시킬 예정. -> viewDidLoad에서 하겠습니다.
Model, View가 서로 커뮤니케이션 하려면? 무조건 Controller를 통해서 해야 함.
Model -> Controller -> View
Property Observing (여기서는 Property Observer인 didSet)
View -> Controller -> Model
@IBAction (View 내의 UITextField의 ValueChanged event (textFieldDidChange 등)혹은 UIButton의 TouchUpInside event)
하지만, MVC의 한계도 물론 존재한다.
1) 3가지 카테고리(Model, View, Controller)에 딱 들어맞지 않는 Object가 있을 수 있다.
2) MVC 패턴만 사용하는 경우, Controller가 너무 비대해지는 경우가 많다. (Controller에 대부분의 로직이 들어가기 때문)
(그래서 MVC를 Massive ViewController로 부르기도 ㅋ) 이를 해결하기 위해 앱의 요구사항에 따른 다른 디자인 패턴을 쓸 수도 있다.
Reference
'Development > iOS' 카테고리의 다른 글
[iOS] App Store 심사 지침 (0) | 2022.02.25 |
---|---|
[iOS] RxSwift (0) | 2022.02.16 |
[iOS] 화면 전환 (0) | 2021.12.20 |
[iOS] UITabBarController (0) | 2021.12.17 |
[iOS] Storyboard Reference (0) | 2021.12.15 |