현재 회사에서 iOS 앱 8개를 맡아서 업무를 하고 있다. 대부분 넘겨받은 앱들이라 기존 작성되어 있는 패턴에다가 살을 붙이는 작업이 주로 하는 업무인데, 이런 업무를 하면서 가장 문제가 되었던 부분은 단연 디자인 패턴에 있다고 생각이 든다.
앱에서 거의 대부분 MVC 패턴을 사용하고 있는데, 처음 볼륨이 작았을 때는 별로 문제가 되지 않았을지 모르지만 점점 기능들이 추가되는데도 불구하고 MVC 패턴을 유지해왔다. 그러다보니 ViewController의 내용이 점점 길어지고 복잡해져서 가독성도 떨어지고 디버깅을 하는데 아주 큰 어려움이 있다.
개인적으로는 상황에 따라 MVC와 MVVM을 혼용하는게 적절하다고 생각하고 있는데, 앱의 볼륨이 너무 커지다 보니 리팩토링이 엄두가 나지 않는 수준이 되어버렸다. 그래도 좀 더 장기적으로 봤을때 리팩토링 과정이 무조건 필요하다고 판단하고 있다.
MVC와 MVVM의 차이?
MVC는 Model-View-Controller의 약자로 Controller가 Model과 View 사이에서 모든 명령을 처리하는 디자인 패턴이다. iOS에서는 ViewController에서 View와 Controller에 해당하는 작업을 해주고, Model은 작업에 필요한 Data Structure를 정의하고 있는게 일반적인 것 같다.
예를들어 User에 대한 정보를 표현해야 하는 UserViewController의 MVC 패턴 구성은 아래와 같다.
- Model에는 User라는 객체를 정의하고 name, email, image라는 properties를 정의해준다.
- View에서는 ViewController 내에 UI를 위한 UILable이나 UIImage 등을 정의해준다. 데이터 변경 등의 이벤트가 발생하면 Controller에서 처리한다.
- Controller는 LifeCycle에 따라 View에 대한 업데이트 이벤트를 전달받고, View에서 사용되는 name이나 image등의 데이터 값에 대한 변경이 필요할 때 데이터를 직접 처리하여 View에게 넘겨준다.
이러한 구성에 위해 User와 UserViewController 두 Swift 파일이 필요하고 각각의 기능들을 채워넣어야 할 것이다. 문제는 User에 대한 기능들이 점점 커지면서 생긴다. UserViewController에는 LifeCycle에 대한 내용과 더불어 User 데이터를 받아오는 로직이나 가공하고 변경하는 등의 로직들로 채워진다. 코드 줄이 길어질 수록 점점 가독성이 떨어지고 관리가 어려워 진다. 이럴때 MVVM 패턴이 효율적일 수 있다.
MVVM은 Model-View-ViewModel의 약자이다. 즉, MVC의 Controller 대신 ViewModel이 자리잡고 있다. 결국 둘의 차이점은 이 Controller와 ViewModel의 차이인 것이다. Controller는 View와 Model 사이에서 생기는 모든 작업을 처리하는 역할이고, ViewModel은 View에서 작업을 할 때 필요한 기능들을 제공해주는 역할이다.
MVVM 패턴으로 User 정보를 작성을 하게되면 다음과 같다.
- Model에는 User라는 객체를 정의하고 name, email, image라는 properties를 정의해준다.
- View는 LifeCycle에 따라 View를 그려준다. 다만 데이터의 가공 및 처리는 ViewModel에서 처리한다.
- ViewModel은 데이터를 받고 가공하여 View에게 넘겨준다.
이렇게 구성하게 되면 User, UserViewController, UserViewModel이라는 세 가지의 파일이 필요하게 되고 각각의 역할분담이 잘 되어서 좀 더 가독성을 높일 수 있다. 게다가 UserViewModel이 자주 사용되는 경우라면 ImageViewModel과 같은 포괄적인 ViewModel을 만들어서 재사용할 수도 있다.
'프로그래밍 > Swift' 카테고리의 다른 글
iOS 개발자 되는 방법 (0) | 2022.01.18 |
---|---|
[Swift] @frozen은 무슨 의미일까? (0) | 2021.12.28 |
[Xcode] Build Configuration 및 Flag 추가하기(#if DEBUG 처럼..) (2) | 2021.09.15 |
[swift] 클래스 (0) | 2021.07.05 |
[swift] 함수와 클로저 (0) | 2021.06.07 |