https://github.com/ReactorKit/ReactorKit
ReactorKit은 Reactor라는 개념을 중심으로 구성된다. Reactor는 기존 MVVM의 ViewModel과 유사하지만, 보다 엄격하게 단방향 데이터 흐름을 강제하여 각 컴포넌트의 역할과 책임을 명확히 구분한다.
reactor
속성을 가짐. 이 속성은 View와 Reactor를 연결하는 다리 역할을 함.bind(reactor:)
메서드를 통해 Reactor의 상태(State)를 View에 바인딩하고, 사용자 액션을 Reactor로 전달함.class MyViewController: UIViewController, View {
var reactor: MyReactor?
override func viewDidLoad() {
super.viewDidLoad()
// reactor 생성 및 바인딩
self.reactor = MyReactor()
bind(reactor: reactor)
}
func bind(reactor: MyReactor?) {
// Reactor의 Action, Mutation, State를 바인딩하는 코드 작성
}
}
mutate(action:)
메서드와 reduce(state:mutation:)
메서드가 있으며, 이들을 통해 상태 변화가 이루어짐.이 세 가지는 ReactorKit의 핵심이며, 각각 다음과 같은 역할을 함.
reduce(state:mutation:)
메서드를 통해 최종적으로 업데이트되며, View는 이 State를 구독하여 화면을 갱신함.struct MyState {
var isLoading: Bool
var items: [Item]
var error: Error?
}
ReactorKit의 가장 큰 장점은 단방향 데이터 흐름에 있다. 데이터 흐름은 다음과 같이 진행된다.
mutate(action:)
메서드가 호출되어, 전달받은 Action을 적절한 Mutation으로 변환함.reduce(state:mutation:)
메서드를 호출하여 현재 State를 기반으로 새로운 State를 계산함.RxSwift의 사용이 ReactiveX를 사용하는 여러 타언어 개발자 간의 소통을 원활하게 하는 점에 대해서 많이 공감이 가고 의미가 있다고 생각했었는데, ReactorKit 또한 비슷한 맥락에서 도움이 될 것이라고 느꼈다. 특히 MVVM 아키텍처 안에서도 여러 형태가 나올 수 있는데, ReactorKit을 통해 정형화된 패턴으로 설계를 할 수 있다보니 이 또한 소통을 원활하게 해줄 것 같다.