RxSwift에 대해 정리해보려고 합니다.
RxSwift에 대한 글은 곰튀김님 강의, Raywenderlich 등이 참고되었습니다.
RxSwift는 Observerble stream(=시퀀스)을 통해 (Swift로)비동기 프로그래밍을 하기 위한 라이브러리입니다.
(https://reactivex.io : An API for asynchronous programming with observable streams)
애플은 비동기 프로그래밍 지원을 위해 많은 API를 제공합니다.
NotificationCenter, Delegate Pattern, GCD, 클로저 등.
+ iOS13부터는 Combine까지.
우리는 iOS 앱을 개발하는 환경에서 매우 다양한 비동기 프로그래밍을 하게 되는데요.
여러 REST API를 호출해 비동기적으로 받아 처리를 하기도 하고,
사실 우리가 UIKit을 통해 사용자로부터 입력을 받는 모든 동작들 또한 비동기 프로그래밍이라고 볼 수 있습니다.
기존에 애플에서 제공하는 방법을 쓰면 안되나요? 라고 생각이 들 수 있지만.
기본 제공하는 비동기 프로그래밍을 작성하면서 해결해야하는 여러가지 문제들이 발생할 수 있습니다.
병렬로 여러 비동기 코드를 실행했을 때 어떤 코드가 먼저 업데이트해야할지 순서의 문제가 있을수도 있고,
메인스레드와 다른 스레드들에서 동작을 했을 때의 처리,
이것들이 모두 실행됐을 때의 처리 등등.
Dispatch와 Delegate메서드, NotificationCenter등 다양한 패턴으로 이리저리 응답을 받아서 작성했을 때,
코드가 복잡해지고 나중에 읽기가 어려운 코드가 되기도 합니다.
그래서 많은 회사들이 이 애플 MVC 패턴에서 벗어나기 위해서 다른 패턴을 적용하고,
이를 위한 라이브러리도 개발되었습니다.
RxSwift는 이런 '다양하고 복잡한 패턴을 한가지로 정리'할 수 있게 해줍니다.
'REST API를 호출해서 데이터를 받으면' ~하고 싶다.
'텍스트필드가 입력되면' ~하고 싶다.
'버튼을 탭하면' ~하고 싶다.
'변수의 값이 바뀌면' ~하고 싶다.
'위 동작들을 모두 하고나면' ~하고 싶다.
모두 'A하면 B를 하고 싶다'의 형태로 정리할 수 있습니다.
A라는 비동기 동작을 하고나면, B라는 동작을 하도록 클로저로 지정을 해놓는 것,
A가 실행되면 B동작으로 반응(Reactive)하게 하는 것을 반응형 프로그래밍이라 하고
이것을 RxSwift가 일관된 패턴으로 작성할 수 있게 해줍니다.
그리고 비동기 동작의 특성(Traits)에 따른 변형들과
비동기로 받은 응답을 가공할 수 있는 다양한 Operator들을 제공해줍니다.
그리고
UIKit의 아키텍쳐인 MVC패턴은 현재 애플에서도 Retire 시킨 상태입니다.(정확히는 Apple MVC..)
애플에서도 MVC가 현재는(?) 좋은 패턴이 아님을 알고 있습니다.
UIKit으로 MVC를 작성하다보면 ViewController가 점점 비대해져
점점 코드리딩, 유지보수, 테스트를 하기 어려운 코드가 되어져버립니다.
(지금은 선언적UI를 작성할 수 있게 해주는 SwiftUI가 릴리즈되어 있습니다)
이에 벗어나서 MVVM 아키텍쳐로 작성하려면 View와 ViewModel을 bind시켜줄 도구가 필요한데.
RxSwift가 Glue Code로써 해당 역할에 잘 어울리기 때문에 많이 사용이 되어지고 있습니다.
(그외에도 PromiseKit, Bolt 등이 있고, MVC에서 벗어나 작성하게 해주는 다양한 도구들이 있고,
RxSwift를 꼭 MVVM에 쓰지 않아도 다른 패턴에도 얼마든 사용할 수 있습니다)
Objective-C가 Swift에 대체되었고, 다양한 라이브러리들이 애플의 MVC를 대체하고,
SwiftUI가 Storyboard, IB를 조금씩 대체시키고 있듯이
시간이 지남에 따라 RxSwift도 Combine에 대체될 수 있겠지만
아직은 RxSwift가 필요한 환경들이 있고, 많은 곳에서 사용중입니다.(이미 RxSwift도 레거시?)