[iOS] MVVM 패턴

Erick·2023년 2월 15일
0

iOS

목록 보기
4/4
post-thumbnail

[iOS] MVVM 패턴


MVC 패턴에 대해서는 전에 포스팅도 하고 "Test UIKit" 프로젝트에서도 사용해 보았습니다. 새로운 프로젝트에서는 MVVM 패턴을 사용하기 위해 MVVM 패턴이란 무엇인지 MVC 패턴과 다른 점은 무엇인지 알아보겠습니다.

MVVM 패턴이란?

MVVM 패턴이란 Model, View, ViewModel로 이루어진 디자인 패턴입니다.
MVC 패턴과 같이 Model은 데이터를 처리하고 View는 사용자가 보는 UI를 담당합니다. 다른 점이 있다면 MVC에서는 Controller가 Model과 View 사이에서 다리 역할을 했다면 MVVM 패턴에서는 ViewModel이 이를 담당합니다.

Model

MVC 패턴의 Model과 같이 앱 내 데이터를 담당합니다.
ViewModel에서 Model을 사용하고, 정보를 보낼 때마다 Model도 업데이트됩니다.

View

View는 사용자가 보는 UI를 담당합니다.
데이터를 표시하고 가져오는 기능을 합니다.
View와 Model은 서로 독립되어 있고 ViewModel에 의해 연결되어 있습니다.

ViewModel

ViewModel은 View에서 동작이나 데이터를 받아 처리하거나 Model을 업데이트하고 다시 View에 전달하여 화면을 나타냅니다.

MVVM 패턴의 장점 및 단점

장점

MVVM 패턴의 장점에서 MVC 패턴의 Controller와 ViewModel의 차이점이 나옵니다.
Controller는 View와 완벽한 분리를 할 수 없어 의존성이 높아진다는 단점이 있었습니다. 하지만 ViewModel은 옵저버 패턴을 사용하여 View와의 의존성을 없애 1:n 연결이 가능합니다.

단점

MVVM 패턴의 단점은 바로 위에 장점과 연결되는 단점이 있습니다.
바로 ViewModel의 설계가 쉽지 않다는 것이 단점입니다.

ViewModel 예제

MVVM 패턴의 단점이 ViewModel을 설계하기 어렵다는 것인데 ViewModel에는 어떤 코드들이 들어가야 하는지 그리고 간단한 예제 코드를 보며 설명하겠습니다.

class PostViewModel: PostViewModelType {
    
    var input: PostViewModel.input
    var output: PostViewModel.output
    
    struct input {
    	let selectPost: AnyObserver<Post>
        //...
    }
    
    struct output {
    	let showPostDetail: Driver<Post>
        //...
    }
    
    init() {
    	let postSubject = PublishSubject<Post>()
        
        self.input = Input(selectPost: postSubject.asObserver())
        self.output = Output(showPostDetail: postSubject.asObservable())
    }
}

위와 같이 ViewModel에는 사용자의 입력을 가져오는 Input 코드와 가져온 데이터를 가공하거나 처리하여 다시 View에 표시하는 Output 코드가 있습니다.
ViewController에서 ViewModel을 프로퍼티로 소유하여 action이 들어오거나 데이터를 보여줘야 할 때 ViewModel의 Input, Output을 가져와 처리합니다.

ViewModel에는 정형화된 유형이 없습니다. 하지만 기본적으로 Input, Output으로 정리하는 방식을 많이 사용합니다.


마치며

이번에 시작하는 프로젝트는 MVVM 패턴을 사용하여 구현할 예정입니다. MVVM 패턴의 간단한 개념은 정리하였고 실제로 MVVM 패턴을 사용하여 프로젝트와 코드를 짜는 것은 추후 프로젝트 포스팅으로 찾아오겠습니다.
MVVM을 사용하는 김에 RxSwift도 사용해 보고 싶은 마음이 생겨 RxSwift를 사용하여 프로젝트를 진행 중인데 아직 코드를 짜기가 어렵네요.. 그래서 다음 포스팅은 프로젝트 포스팅이 아닌 RxSwift에 대한 포스팅으로 찾아오겠습니다.

profile
iOS Developer

0개의 댓글