[swift] Swift MVVM 아키텍처에서의 컴포넌트 간 통신 방법

MVVM(Mode-View-ViewModel)은 소프트웨어 아키텍처의 디자인 패턴으로, iOS 앱 개발에서 많이 사용됩니다. 이 아키텍처는 모델, 뷰, 뷰모델로 구성되며, 각 컴포넌트 간의 효율적인 통신이 중요합니다. 이 글에서는 Swift 언어를 사용하여 MVVM 아키텍처에서 컴포넌트 간 통신 방법을 알아보겠습니다.

뷰(View)와 뷰모델(ViewModel) 간 통신

뷰(View)와 뷰모델(ViewModel) 간의 통신은 주로 바인딩(Binding)을 통해 이루어집니다. 바인딩은 뷰모델의 속성과 뷰의 속성을 서로 연결하여 데이터의 변경을 자동으로 반영하는 방식입니다. 이를 통해 뷰와 뷰모델은 독립적으로 작업할 수 있으며, 데이터의 변화가 자동으로 반영되므로 UI를 업데이트하는 데 유용합니다.

Swift의 경우, 여러 라이브러리를 사용하여 바인딩을 구현할 수 있습니다. 예를 들어, RxSwift, Combine, 또는 SwiftUI의 @Bindable 속성 등을 사용할 수 있습니다.

import RxSwift

class ViewModel {
    let name = BehaviorSubject<String>(value: "")
    let age = BehaviorSubject<Int>(value: 0)
}

// 뷰(View)에서의 사용 예시
class View {
    private let disposeBag = DisposeBag()
    private let viewModel = ViewModel()
    
    func bind() {
        viewModel.name
            .subscribe(onNext: { name in
                print("이름 변경됨: \(name)")
            })
            .disposed(by: disposeBag)
        
        viewModel.age
            .subscribe(onNext: { age in
                print("나이 변경됨: \(age)")
            })
            .disposed(by: disposeBag)
    }
}

위 코드에서는 RxSwift를 사용하여 바인딩을 구현한 예시입니다. ViewModel 클래스의 nameage 속성은 BehaviorSubject로 선언되어 있습니다. 뷰(View)에서는 bind() 메소드를 통해 nameage 속성에 대한 바인딩을 수행하고, 이를 통해 데이터의 변경을 감지하고 처리할 수 있습니다.

뷰모델(ViewModel) 내의 컴포넌트 간 통신

뷰모델(ViewModel) 내의 컴포넌트 간의 통신은 주로 프로퍼티 감시자(Property Observer)를 사용하여 이루어집니다. 프로퍼티 감시자를 사용하면 특정 프로퍼티의 값이 변경될 때마다 추가적인 로직을 실행할 수 있으므로, 뷰모델 내의 다른 컴포넌트와의 통신에 유용합니다.

class ViewModel {
    var data: String = "" {
        didSet {
            print("데이터 변경됨: \(data)")
        }
    }
    
    func updateData(newData: String) {
        data = newData
    }
}

let viewModel = ViewModel()
viewModel.updateData(newData: "새로운 데이터")

위 코드에서는 ViewModel 클래스 내의 data 프로퍼티에 프로퍼티 감시자를 사용하여 값을 변경할 때마다 “데이터 변경됨” 메시지를 출력하는 예시입니다. updateData() 메소드를 호출하여 data 값을 업데이트하면, 프로퍼티 감시자가 실행되어 변경을 감지하고 추가 로직을 실행합니다.

결론

Swift MVVM 아키텍처에서 컴포넌트 간의 통신은 바인딩과 프로퍼티 감시자를 통해 이루어집니다. 뷰와 뷰모델 간의 통신은 주로 바인딩을 통해 데이터의 변경을 자동으로 반영하며, 뷰모델 내의 컴포넌트 간의 통신은 프로퍼티 감시자를 사용하여 값의 변경을 감지하고 추가 로직을 실행합니다. 이를 통해 MVVM 아키텍처에서 컴포넌트 간의 효율적인 통신을 구현할 수 있습니다.

참고 링크: