[swift] RxCocoa를 활용한 뷰 모델 패턴 구현

뷰 모델 패턴은 iOS 개발에서 매우 유용하게 활용되는 패턴 중 하나입니다. 이 패턴은 앱의 비즈니스 로직을 뷰 컨트롤러에서 분리하여 더 모듈화하고 테스트하기 쉽게 만들어줍니다. RxCocoa는 RxSwift와 함께 사용되며, 이를 활용하면 뷰 모델 패턴을 더욱 효과적으로 구현할 수 있습니다.

RxCocoa 소개

RxCocoa는 Cocoa 프레임워크의 여러 클래스와 컴포넌트에 ReactiveX 스타일의 바인딩을 제공해줍니다. 이를 통해 UI 컨트롤과 뷰 모델간의 데이터 흐름을 쉽게 구현할 수 있습니다.

RxCocoa의 핵심 클래스는 DriverSignal입니다. Driver는 UI 컨트롤의 상태나 이벤트를 관찰할 수 있게 해주고, Signal은 비동기 작업의 결과를 전달하는 역할을 합니다.

뷰 모델 패턴 구현하기

1. 뷰 모델 클래스 생성

먼저, 뷰 모델 클래스를 생성합니다. 이 클래스는 비즈니스 로직을 담당하고, 뷰에 필요한 데이터를 제공합니다. 예를 들어, 사용자 목록을 가져오는 기능을 가진 뷰 모델을 만들어보겠습니다.

import RxSwift

class UserViewModel {
    private let apiService: APIService
    
    init(apiService: APIService) {
        self.apiService = apiService
    }
    
    func getUsers() -> Observable<[User]> {
        return apiService.getUsers()
    }
}

2. 뷰 컨트롤러와 바인딩

뷰 컨트롤러에서는 뷰 모델과의 바인딩을 통해 데이터 흐름을 구현합니다. RxCocoa의 bind(to:) 메서드를 사용하면 뷰 모델의 데이터를 UI 컴포넌트에 연결할 수 있습니다. 이를 통해 비동기 작업의 결과를 UI에 표시할 수 있습니다.

예를 들어, UITableView에 사용자 목록을 표시하는 경우 다음과 같이 바인딩할 수 있습니다.

import RxCocoa
import RxSwift

class UserViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!
    
    private let disposeBag = DisposeBag()
    private let userViewModel = UserViewModel(apiService: APIService())
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        userViewModel.getUsers()
            .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, user, cell in
                cell.textLabel?.text = user.name
            }
            .disposed(by: disposeBag)
    }
}

위의 예제에서는 getUsers() 메서드의 결과를 tableView.rx.items로 바인딩하여 테이블 뷰의 셀에 사용자 이름을 표시하고 있습니다.

3. 화면 갱신

뷰 모델은 반응형 프로그래밍의 개념을 활용하기 때문에, 데이터가 변경될 때마다 UI를 자동으로 갱신할 수 있습니다. 예를 들어, 사용자 목록이 업데이트되면 테이블 뷰가 자동으로 갱신됩니다.

userViewModel.getUsers()
    .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, user, cell in
        cell.textLabel?.text = user.name
    }
    .disposed(by: disposeBag)

위의 예제에서 getUsers() 메서드의 결과를 통해 테이블 뷰의 내용을 업데이트하고 있습니다. 데이터가 변경되면 자동으로 테이블 뷰가 갱신되기 때문에 뷰 컨트롤러에서 수동으로 UI를 업데이트하는 코드를 작성할 필요가 없습니다.

결론

RxCocoa를 활용하여 뷰 모델 패턴을 구현하면 iOS 앱의 비즈니스 로직을 더 간결하고 모듈화된 방식으로 구성할 수 있습니다. 뷰 모델과 UI 컴포넌트간의 데이터 바인딩을 쉽게 구현할 수 있으며, 데이터의 변경에 따라 UI를 자동으로 갱신할 수 있습니다. 이를 통해 개발자는 더욱 효율적으로 앱을 구현할 수 있습니다.

참고 자료