ReactiveX
CROSS-PLATFORM Available for idiomatic Java, Scala, C#, C++, Clojure, JavaScript, Python, Groovy, JRuby, and others
reactivex.io
드디어 말로만 듣던 RxSwift를 처음 접하게 되었다. 러닝 커브가 꽤 있기도 하고 지금 까지 해왔던 방식과는 다른 방식으로 코드를 작성해야한다니 걱정 반 설렘 반으로 RxSwift를 공부하게되었다.
그래서 RxSwift가 뭘까?
RxSwift는 Reactive + Extension+ Swift의 합성어로 RxSwift라는 단어에서 Rx는 ReactiveX, Reactive 반응? 적으로 무엇을 하는건가? 하는 생각이 들기는 했다. ReactiveX 공식문서에 가보면 처음 소개 문구에 다음과 같이 적혀있다.
An API for asynchronous programming
with observable streams
Observable Stream을 포함하는? 비동기 프로그래밍을 위한 API? 라고 설명하고 있다. 해석이 매끄럽지 않을 수 있지만 이런 의미이다. 듣기로는 마이크로소프트에서 만들었고 어떤 프로젝트에 적용했지만 해당 프로젝트는 실패? 하고 Reactive Framework라는 프로젝트로 분리하여 계속 개발을 진행하였고, 이것이 훗날 Rx인 것으로 알고 있다. 이것이 다른 여러 언어에서 지원되고 사용되고 있는 것이다.
뭐 아닐수도 있지만 이런 역사를 알면 재밌기도 해서 적어봤다.
그럼 본격적으로 Rx가 뭔지 알아보자.
말 그대로 Reactive(반응형) 반응형 프로그래밍을 쉽게 할 수 있도록 도와주는 Tool 이라고 생각하면된다.
~형 프로그래밍? 많이 들어본 단어이다. 컴퓨터 기초를 배우면 절차지향 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍 이 있듯
반응형 프로그래밍 또한 프래그래밍을 함에 있어 하나의 패러다임인 것이다.
반응형 프로그래밍이란?
반응형 프로그래밍이란?
- 데이터의 흐름, 변경사항을 전파하는데에 중점을 둔 프로그래밍 패러다임
- 즉, 주변 환경에 변화가 발생하면 이벤트를 받아 동작하도록 설계하는 방식
어려운 이론적 이야기말고 실생활에서 사용되는 정말 쉬운 예시를 하나 보면 바로 이해가 될 것 같다.
우리는 엑셀, 구글 스프레드시트를 많이 이용하게 되는데 다음 이미지를 보자.
아주 간단한 예시로 A1 셀과 B1 셀의 값(데이터)를 넣고 C1셀은 '=A1+B1' 이라는 함수를 작성했다.
그렇게되면 A1이나 B1의 값이 하나만 바뀌어도 C1셀의 값은 함수의 결과를 바로 반응하여 나타내게 된다. 이게 바로 반응형 프로그래밍이다.
이런 원리, 구조만 머리속에 새겨놓고 앞으로 프로젝트를 하면서 RxSwift를 적용해볼 예정이다.
위의 엑셀 예시를 가능하게 해주는 Rx의 기능들(Observable, Observer, Operator... 등)을 학습해갈 예정이다.
RxSwift는
비동기 프로그래밍을 관찰 가능한 순차적 형태와 함수 형태의 연산자를 통해 처리하게끔 도와준다.
RxSwift는 어떤 비동기 이벤트에 대해 관찰 가능한 형태로 만들고 함수 형태의 연산자를 통해 비동기 이벤트의 변화에 따른 전파를 받을 수 있고 또한 여러 연산을 처리할 수 있게하는 프레임워크인 것이다.
왜 RxSwift를 사용해야할까?
- why use rx?
https://github.com/ReactiveX/RxSwift/blob/main/Documentation/Why.md
RxSwift 공식문서에도 왜 Rx를 사용할까? 에 대한 답변이 나와있다. 공식문서 보면 사용 이유에 대한 예시가 몇가지 있는데 한번 살펴보자.
Bindings
Observable.combineLatest(firstName.rx.text, lastName.rx.text) { $0 + " " + $1 }
.map { "Greetings, \($0)" }
.bind(to: greetingLabel.rx.text)
코드를 선언적인 방식으로 앱을 구축할 수 있다. 코드가 마치 SwiftUI랑 비슷하다는 느낌을 준다. 메서드 체이닝 기법을 통해 로직을 구현하는 모습이다.
TableView 또한 Delegate 패턴 대신 다음과 같이 구현한다.
viewModel
.rows
.bind(to: resultsTableView.rx.items(cellIdentifier: "CustomTableViewCell", cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in
cell.title = viewModel.title
cell.url = viewModel.url
}
.disposed(by: disposeBag)
UIKit에서 Delegate 패턴을 통해 구현하였던 TableView의 양식이 아닌 rx를 통해 간단하게 작성이 가능하다. 마치 DiffableDatasource를 통해 만들던 방식과 비슷해보인다.
Retries
func doSomethingIncredible(forWho: String) throws -> IncredibleThing
위와 같은 API를 호출하는 메서드가 있다고 했을 때 실패했을 경우 재실행을하기가 쉽지 않은데 다음과 같이 rx를 사용한다면 쉽게 가능하다고 나와있다.
doSomethingIncredible("me")
.retry(3)
등등 여러가지 이유가 있으니 한번 살펴보면 좋을 것 같다. 지금까지 Rx에 대한 개념과 사용 이유에 대해 알아봤다. 그럼 이제 실제 어떻게 적용할 것이고 자세히 개념들을 알아보자.
🔗 References
https://github.com/ReactiveX/RxSwift
GitHub - ReactiveX/RxSwift: Reactive Programming in Swift
Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.
github.com
'iOS > RxSwift' 카테고리의 다른 글
RxSwift - API Request, Error Handling (+ Button Tap Stream), Single Traits (0) | 2023.11.16 |
---|---|
RxSwift - Unicast, Multicast (1) | 2023.11.06 |
RxSwift - Dispose, Disposable, DisposeBag (2) | 2023.11.03 |
RxSwift - Subject (1) | 2023.11.02 |