[iOS 18주차] ReactorKit

DoyleHWorks·2025년 2월 19일
0

https://github.com/ReactorKit/ReactorKit


1. ReactorKit 개요

ReactorKit은 Reactor라는 개념을 중심으로 구성된다. Reactor는 기존 MVVM의 ViewModel과 유사하지만, 보다 엄격하게 단방향 데이터 흐름을 강제하여 각 컴포넌트의 역할과 책임을 명확히 구분한다.

  • 문제점:
    기존의 데이터 흐름이 명확하지 않으면, 상태 변화나 비동기 작업 관리가 어려워지고, 결과적으로 유지보수가 복잡해지는 문제가 발생한다.
  • 해결 방법:
    ReactorKit은 단방향 데이터 흐름을 적용함으로써, 입력(사용자 액션)에서 출력(화면 상태)까지의 변화를 체계적으로 관리한다.

2. 주요 구성 요소

2.1. View

  • 역할:
    사용자와 상호작용하며, 화면에 데이터를 표시.
  • 특징:
    • 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를 바인딩하는 코드 작성
        }
    }

2.2. Reactor

  • 역할:
    Reactor는 데이터 가공 및 상태 관리의 중추 역할을 수행하며, 기존의 ViewModel과 동일한 책임을 짐.
  • 특징:
    • Reactor는 Action, Mutation, State 세 가지 개념을 통해 동작함.
    • Reactor 내부에는 mutate(action:) 메서드와 reduce(state:mutation:) 메서드가 있으며, 이들을 통해 상태 변화가 이루어짐.

2.3. Action, Mutation, State

이 세 가지는 ReactorKit의 핵심이며, 각각 다음과 같은 역할을 함.

Action

  • 정의:
    사용자 입력(예: 버튼 클릭, 스크롤 등)을 나타내는 열거형임.
  • 특징:
    • Action은 단순한 사용자 이벤트를 표현하며, 발생한 액션이 잘못된 결과를 초래할 경우, 문제의 원인을 파악하기 위한 첫 번째 확인 지점이 됨.

Mutation

  • 정의:
    Action에 의해 발생한 이벤트를 내부적으로 처리 가능한 형태로 변환하는 열거형임.
  • 역할:
    • Action과 State 사이의 다리 역할을 함.
    • 데이터 가공 및 비동기 작업 등, 상태에 영향을 주기 위한 모든 처리는 Mutation을 통해 수행됨.

State

  • 정의:
    현재 화면에 표시될 데이터를 구조체로 표현한 것임.
  • 특징:
    • State는 Reactor의 reduce(state:mutation:) 메서드를 통해 최종적으로 업데이트되며, View는 이 State를 구독하여 화면을 갱신함.
  • 예시:
    struct MyState {
        var isLoading: Bool
        var items: [Item]
        var error: Error?
    }

3. 데이터 흐름과 처리 과정

ReactorKit의 가장 큰 장점은 단방향 데이터 흐름에 있다. 데이터 흐름은 다음과 같이 진행된다.

  1. Action 발생
    • 사용자가 버튼 클릭 등 상호작용을 통해 Action을 발생시킴.
  2. mutate(action:) 호출
    • Reactor 내부에서 mutate(action:) 메서드가 호출되어, 전달받은 Action을 적절한 Mutation으로 변환함.
    • 이 과정에서 비동기 작업, 네트워크 요청 등 데이터 가공 로직이 수행될 수 있음.
  3. reduce(state:mutation:) 호출
    • Mutation이 생성되면, Reactor는 reduce(state:mutation:) 메서드를 호출하여 현재 State를 기반으로 새로운 State를 계산함.
    • 이 새로운 State는 다시 View에 바인딩되어 화면에 반영됨.

4. 디버깅 및 유지보수의 용이성

  • 명확한 데이터 흐름:
    단방향 데이터 흐름으로 인해, 특정 상태 업데이트에 문제가 생겼다면, Action → Mutation → State 각 단계에서 어디서 문제가 발생했는지 쉽게 파악할 수 있음.
  • 역할의 분리:
    각 구성요소가 명확한 책임을 가지므로, 코드의 모듈성이 높아지고, 유지보수 및 확장이 용이함.
  • 예측 가능한 상태 변화:
    모든 상태 변화는 순차적으로 발생하므로, 상태 관리가 예측 가능하고, 리액티브 프로그래밍의 장점을 최대한 활용할 수 있음.

5. ReactorKit의 장점 요약

  • 단방향 데이터 흐름:
    복잡한 상태 관리를 체계적으로 처리하며, 디버깅 시 흐름을 쉽게 추적할 수 있음.
  • 명확한 역할 분리:
    View, Reactor, Action, Mutation, State 각각의 책임이 구분되어 있어 유지보수와 테스트가 용이함.
  • RxSwift와의 시너지:
    RxSwift의 강력한 리액티브 프로그래밍 기능을 활용하여 비동기 작업과 이벤트 처리를 간결하게 구현할 수 있음.
  • 유연한 구조:
    비동기 작업, 네트워크 요청, 데이터 가공 등 다양한 기능을 Reactor 내부에서 처리할 수 있어 확장이 쉬움.

인사이트

RxSwift의 사용이 ReactiveX를 사용하는 여러 타언어 개발자 간의 소통을 원활하게 하는 점에 대해서 많이 공감이 가고 의미가 있다고 생각했었는데, ReactorKit 또한 비슷한 맥락에서 도움이 될 것이라고 느꼈다. 특히 MVVM 아키텍처 안에서도 여러 형태가 나올 수 있는데, ReactorKit을 통해 정형화된 패턴으로 설계를 할 수 있다보니 이 또한 소통을 원활하게 해줄 것 같다.

profile
Reciprocity lies in knowing enough

0개의 댓글

관련 채용 정보