[swift] Swift MVVM 아키텍처 패턴

MVVM(Modeled-View-ViewModel)은 애플리케이션의 UI와 비즈니스 로직을 분리하여 관리하는 아키텍처 패턴입니다. 이 패턴은 코드의 유지보수성을 높이고 테스트 용이성을 향상시키는데 도움을 줍니다. 이번 글에서는 Swift 언어를 사용하여 MVVM 아키텍처 패턴을 구현하는 방법에 대해 알아보겠습니다.

모델(Model)

모델은 애플리케이션의 데이터를 나타냅니다. 주로 struct 형태로 정의되며, 데이터를 저장하고 변경하기 위한 메서드를 포함합니다. 모델은 데이터의 상태 변화를 알리는 역할이 없으며, 그저 데이터를 담고 있는 객체입니다.

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

뷰(View)

뷰는 애플리케이션의 사용자 인터페이스를 나타냅니다. 주로 UIViewController 혹은 UIView 서브클래스로 정의되며, 사용자와의 인터랙션에 반응하여 화면을 업데이트합니다.

class UserViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var ageLabel: UILabel!
    
    var viewModel: UserViewModel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        bindViewModel()
    }
    
    func bindViewModel() {
        nameLabel.text = viewModel.name
        ageLabel.text = "\(viewModel.age)"
    }
}

뷰모델(ViewModel)

뷰모델은 뷰로부터 전달받은 입력을 처리하고, 모델로부터 필요한 데이터를 가져와 뷰에게 전달합니다. 또한, 애플리케이션의 비즈니스 로직을 구현하고 모델과 뷰 간의 통신을 담당합니다.

class UserViewModel {
    private var user: User
    
    init(user: User) {
        self.user = user
    }
    
    var name: String {
        return user.name
    }
    
    var age: Int {
        return user.age
    }
}

사용 예시

let user = User(name: "John", age: 30)
let viewModel = UserViewModel(user: user)

let viewController = UserViewController()
viewController.viewModel = viewModel

// UserViewController가 표시되는 시점에 필요한 데이터를 뷰모델에서 가져와 UI를 업데이트한다.
viewController.bindViewModel()

이렇게 MVVM 아키텍처 패턴을 사용하면 뷰와 모델이 강하게 결합되는 것을 막고, 테스트 용이성을 높이고 코드의 재사용성을 향상시킬 수 있습니다. 또한, 이 패턴은 애플리케이션의 로직을 뷰로부터 분리하여 관리하기 때문에, 큰 프로젝트에서 유용하게 사용할 수 있습니다.

참고자료