중급(책에 따르면) 디자인 패턴 시작이다.
이전까지 배운 기초 패턴은 다음과 같다.
- MVC
- Delegation
- Strategy
- Singleton
- Memento
- Observer
- Builder
어떤 패턴인지 알고 사용한 경우도 있었고
코드 컨벤션인줄 알고 아 이렇게 쓰나보다하고 썼던 코드가 디자인 패턴이였구나 알게된 경우도 있었고
써보지도 않았고 처음 알게된 경우도 있었다.
그럼 중급 패턴으로 한번 가보자
MVVM - Model View ViewModel
MVVM은 각각의 객체들을 3가지 그룹으로 나누는 Structural design pattern 이다.
- Model: 앱 데이터를 담고있다. 대부분 구조체이거나 단순한 class 로 구성된다.
- Views: 시각적인 요소와 스크린의 control를 담당한다. UIView의 서브클래스로 구성된다.
- View models: model 에 있는 정보를 화면에 보여줄 수 있는 형태로 가공한다. Class 를 사용하기 때문에 reference 로 여기저기에서 참조되며 사용할 수 있다.
MVC 패턴과 비슷하게 보인다. MVVM 에서도 View controller 는 있지만 하는 역할은 최소로 줄어든다. 그래서 MVC 패턴에서 View controller 에 코드양이 많아지는 문제를 MVVM 을 통해 해결할 수 있다. View controller 의 책임을 ViewModel 이 나눠 갖는 느낌이다.
MVVM 은 언제 사용해야 할까
model 의 데이터를 view 에 맞게 가공해야 할때 사용한다. 예를들어 view model에 Date 타입을 String 타입으로 바꾸는 코드를 작성하거나 Decimal 타입을 달러나 원과 같은 화폐단위를 붙인 String으로 바꾸는 코드를 작성할 수 도 있다.
이 패턴은 view model 을 빼면 MVC랑 동일하다. 하지만 View Model 의 코드가 view controller 에 전부 몰리기 때문에 문제가 생긴다.
이미 view controller 는 view life cycle 과 IBActions들의 callback 과 다른 여러 일들을 이미 하고 있기 때문에 MVC(Massive View Controller)가 될 수 있는 문제가 있다.
view controller 가 모든 일을 하지 않도록 하기 위해선 MVVM 을 쓰면 된다.
Decoupling, 결합도를 낮추는 건 소프트웨어 공학적으로도 좋은 소프트웨어가 되는 조건중 하나이다.
MVVM 을 사용할 때 주의할 점
- model - to - view 에서 많은 데이터 변환이 필요할 때 좋다. model 인지 view 인지 view model 인지 모호한 객체들이 있다. 이럴 땐 MVVM 과 더불어 다른 design pattern을 사용해야 한다.
- MVVM은 처음 application을 만들때 적합하지 않다. 만약 처음 만드는 것이라면 MVC로 시작하는게 좋을 수 도 있다. 앱의 요구사항이 바뀔 수 도 있고 그에 따라 다른 디자인 패턴을 차용해야 할 경우도 있기 때문이다. 나중에 정말 필요할 때 MVVM을 적용하는 것이 좋다.
- 바꾸는걸 두려워 하지 마라. 대신 미리 계획해라(응?)
MVVM 요약
- MVVM 은 view controller 의 코드라인을 줄여 관리가 수월하게 할 수 있다.
- view model 은 객체를 다른 객체로 변환하는데 쓰여진다. 변환된 객체는 view controller 를 통해 view 에 표현된다.
데이터에 추가적인 계산이 필요한 작업에 쓰인다. - view model을 하나의 view 와 사용한다면 모든 configuration을 view model 에 몰아도 되지만, 하나 이상의 view 에 사용할 경우 헷갈릴 수 있다. 이럴 땐 각각의 view 에 맞는 configure code 를 가지는게 단순하게 좋다.
- 앱의 규모가 작을 경우 MVC 로 시작하기 좋다. 만약 앱의 요구사항이 달라지면 그에 따라 적절한 design pattern을 골라 쓰면 된다.
MVVM 예제(RxSwift 를 사용하지 않은)
[코드]
'iOS > Design Pattern' 카테고리의 다른 글
Design Pattern - Adapter Pattern (0) | 2020.08.30 |
---|---|
Design Pattern - Factory Pattern (0) | 2020.08.25 |
Design Pattern - Builder Pattern (0) | 2020.08.09 |
Design Pattern - Observer Pattern (0) | 2020.08.09 |
Design Pattern - Memento Pattern (0) | 2020.08.09 |
댓글