[swift] Swift에서의 MVVM 아키텍처 구현 방법

MVVM(Modeal-View-ViewModel)은 애플리케이션의 개발을 위한 아키텍처 패턴 중 하나입니다. 이 아키텍처는 애플리케이션의 로직과 UI를 분리하여 유지보수 및 테스트 용이성을 높이는 장점이 있습니다. Swift에서 MVVM 아키텍처를 구현하는 방법에 대해 알아보겠습니다.

1. Model

Model은 애플리케이션의 데이터와 비즈니스 로직을 담당합니다. Swift에서는 구조체나 클래스를 사용하여 모델을 정의할 수 있습니다. 예를 들어, 사용자 정보를 담은 User 모델을 정의해보겠습니다.

struct User {
    let name: String
    let age: Int
}

2. View

View는 사용자 인터페이스를 담당합니다. 이는 사용자에게 데이터를 표시하고 사용자의 이벤트에 반응하는 역할을 수행합니다. Swift에서는 SwiftUI를 사용하여 View를 구현할 수 있습니다. 예를 들어, User 정보를 출력하는 UserView를 정의해보겠습니다.

import SwiftUI

struct UserView: View {
    let user: User
    
    var body: some View {
        VStack {
            Text("Name: \(user.name)")
            Text("Age: \(user.age)")
        }
    }
}

3. ViewModel

ViewModel은 View와 Model 사이에서 동작하며, View에 필요한 데이터와 메소드를 제공합니다. 또한 Model과의 상호작용을 담당합니다. Swift에서 ViewModel을 구현하기 위해서는 Combine 프레임워크를 활용할 수 있습니다. 예를 들어, User 정보를 관리하는 UserViewModel을 정의해보겠습니다.

import Combine

class UserViewModel: ObservableObject {
    @Published var user: User
    
    init(user: User) {
        self.user = user
    }
    
    func updateName(_ name: String) {
        user.name = name
    }
    
    func updateAge(_ age: Int) {
        user.age = age
    }
}

위의 예시에서 @Published 프로퍼티 래퍼를 사용하여 user 객체를 감시하도록 설정하였습니다.

4. View와 ViewModel 연결

View와 ViewModel을 연결하여 동작시키려면, SwiftUI의 @StateObject@ObservedObject 프로퍼티 래퍼를 사용하여 ViewModel을 선언하고, View 내에서 해당 ViewModel에 접근해야 합니다. 예를 들어, UserView와 UserViewModel을 연결하는 방법은 아래와 같습니다.

struct ContentView: View {
    @StateObject private var userViewModel = UserViewModel(user: User(name: "John", age: 30))
    
    var body: some View {
        UserView(user: userViewModel.user)
    }
}

위의 예시에서 @StateObject 프로퍼티 래퍼를 사용하여 userViewModel을 선언하였습니다. 이렇게 선언된 userViewModel은 ContentView 내에서만 유지되고, 변경 사항을 감지할 수 있도록 합니다.

결론

Swift에서 MVVM 아키텍처를 구현하는 방법을 알아보았습니다. MVVM은 코드의 재사용성과 유지보수의 편의성을 높이는데 도움을 주는 강력한 아키텍처 패턴입니다. SwiftUI와 Combine을 함께 사용하면 보다 효과적인 MVVM 구현이 가능합니다. 이를 활용하여 더욱 모듈화되고 유연한 애플리케이션을 개발해보세요.

참고 자료