-
ReactorKit 사용기iOS/Wiki 2022. 3. 5. 01:50
안녕하세요 🐶 오늘은 ReactorKit을 사용하는 방법에 대해서 정리해보려고 합니다.
바로 시작하겠습니다.
왜 ReactorKit을 사용하게 되었는지
MVVM 패턴 + Input Output을 활용하면서 느낀 점이 있었다.
Swift에서 MVVM 패턴으로 작성된 코드를 살펴보게 되면, 굉장히 많은 방법으로 구현되어있음을 느낄 수 있었다.
최근 작성된 코드들을 살펴보면, Input과 Output을 활용하여 입력, 출력으로 추상화하는 방법을 많이 사용하는 것 같은데,
이 Input과 Output을 활용하는 방법에도
func transform(input: Input) -> Output { }
이렇게 함수를 만들어서 활용하는 방법과,
뷰 모델 클래스 안에 Input, Output를 인스턴스로 만든 뒤 이니셜라이져에서 Input, Output을 알맞게 바인딩해주는 방법 등 여러가지 방법으로 구현되어 있었다.
그래서 들었던 생각이, 이렇게 작성하는 방법이 과연 일관성 있는 코드를 작성하는 것인가?? 라는 것이었다.
이런 의문이 들던 와중, ReactorKit을 알게되었고, 이 부분을 해결해줄 수 있을 것 같아서 한번 사용해보자!!!!! 라는 생각으로 사용하게 됐당
ReactorKit? MVVM?
먼저, 기존에 사용하던 MVVM의 로직을 살펴보면,
이런 구조로 이루어져 있는데, 뷰 모델이 모델과 뷰 사이에서 양방향으로 데이터 통신을 하고 있는 형태로 작성되어있다.
MVC에서 Controller가 비대해지는 문제를 해결할 수 있지만, MVVM을 사용해보니 딱 정해진 틀이 없어 여러가지 형태로 작성된 코드들이 많았다.
리액터킷은 이런 문제점을 해결하기 위해 고안된 아키텍쳐중 하나로, 다음과 같은 로직을 따른다.
View
뷰는 상태(State)를 받아 표현할 수 있다.
뷰는 뷰 컨트롤러, 셀 모두를 포함한다.
User Interaction을 Action으로 추상화하여 Reactor에 전달할 수 있다.
Reactor에서 전달받은 State를 뷰 컨포넌트들에 바인드한다.
비즈니스 로직을 수행하지 않는다.
뷰를 정의하기 위해서는 View 프로토콜을 채택해야 한다.
이런 식으로 프로토콜을 채택해주게 되면, 채택한 뷰 컨트롤러 클래스 내부에 DisposeBag과 bind(reactor:) 메서드를 작성해줘야 한다.
bind(reactor:) 메서드에 들어갈 매개변수로는 Reactor를 만들어서 넣어주면 된다.
그렇게 되면 Reactor 속성이 자동으로 생성되게 되고, 이 리액터에 새로운 값이 들어오면 자동적으로 bind 메서드가 실행되게 된다.
이제 bind 메서드에서 UI를 바인딩하거나, Reactor의 상태를 뷰에 바인딩하는 코드를 작성하면 된다.
첫번째 코드는 mainView의 UI를 reload라는 Action으로 변환한 뒤, reactor의 action에 바인딩을 해주는 코드다.
그리고 reactor에 명시해둔 상태인 lottoInfo를 원하는 뷰 컴포넌트에 바인딩 해주는 코드다.
그리고 이니셜라이져 및 라이프사이클 메서드에서 알맞게 코드를 작성해주면 뷰를 정의해주는 과정은 끝이난다.
Reactor
Reactor는 뷰의 상태를 관리한다.
뷰에서 Action을 전달받으면,
비즈니스 로직을 수행한 뒤 상태를 변경하고, 변경한 상태를 뷰에 전달한다.
리액터를 정의하기 위해서는 Reactor 프로토콜을 채택해주어야 한다.
프로토콜을 적용하려면, UI를 표현하는 Action, 뷰의 상태를 표현하는 State, 상태를 변경하는 단위인 Mutation을 작성해야 한다.
또한, 기본 상태를 나타내는 initial State가 필요하다.
Action과 State는 리액터 클래스 밖에서 접근 가능하지만, Mutation은 클래스 밖으로 노출되지 않는다.
Mutation은 클래스 내부에서 Action과 State를 연결시켜주는 역할을 하는데,
뷰에서 액션이 들어오게 되면 mutate와 reduce 메서드를 사용해서 상태를 처리하게 된다.
mutate 메서드는 Action 스트림을 Mutation 스트림으로 변경하는 역할을 한다.
이 메서드 내부에서 네트워크 및 비동기 작업의 사이드이펙트를 처리할 수 있다.
리턴값으로 Mutation을 방출하는데, 이 값이 reduce 메서드로 전달된다.
reduce 메서드는 이전 상태와 Mutation을 받아 새로운 상태를 반환하는 메서드다.
전체 코드 보러가기
GitHub - makemakeway/ReactorKitTest: 리액터킷 예제
리액터킷 예제. Contribute to makemakeway/ReactorKitTest development by creating an account on GitHub.
github.com
같은 코드를 MVVM + Input Output 패턴으로도 작성해보고, ReactorKit을 활용해서도 작성해봤다.
MVVM으로 작성했을 때의 장점은 아무래도 익숙한 패턴이다보니 슉슉 작성된다는 것..?
하지만 뷰 모델이 커지고 관리해야할 상태가 많아지면 상태 관리가 꽤 까다로울 것 같다는 생각이 들었다.
ReactorKit은 상태를 reduce 메서드를 통해 관리하다보니 상태 관리가 간단해진다는 장점이 있었다.
그리고 MVVM을 사용하면서 느꼈던 일관성에 대한 부분도
ReactorKit에서는 패턴이 정해져 있어서 좀 더 일관성 있는 코드를 작성할 수 있지 않을까?? 라는 생각이 들었다.
리액터 킷을 만든 개발자 전수열님의 블로그
https://medium.com/styleshare/reactorkit-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-c7b52fbb131a
'iOS > Wiki' 카테고리의 다른 글
SOLID in Swift (0) 2022.04.04 POP(Protocol-Oriented Programming) in Swift (1/2) (0) 2022.03.28 Swift ARC(Automatic Reference Counting) (0) 2022.01.15 Localization (0) 2022.01.14 페이지네이션(Pagination) (0) 2022.01.13