iOS/Swift

RxSwift 는? Reactive 프로그래밍을 알아보자 1

StudySpare 2022. 2. 4. 18:45
반응형

이전에 Combine 에 대해 알아보면서 RxSwift를 언급했다. Reactive Programming 이라는 사실만 알 뿐, 실제로 사용해서 개발한 경험은 없다. 결국엔 iOS 네이티브를 한 번 랩핑해놓은 서드파티 라이브러리 라고 생각했기 때문이었다. 비동기 처리를 위해 거대한 서드파티 라이브러리를 개발에 포함시키고 싶지 않았다. Apple에서 정식으로 지원하는 것도 아니기에 굳이 위험부담을 감수할 필요가 없었다. 그런데 이번에 합류한 조직에서 RxSwift를 적극 사용한다고 한다. 그래서 RxSwift와 조금 친해져보려고 책을 펼쳤다.

RxSwift: Reactive Programing with Swift

 

RxSwift: Reactive Programming with Swift

<p>Leverage the power of RxSwift in your reactive apps!</p> <p>This book is for iOS developers who already feel comfortable with iOS and Swift, and want to dive deep into development with RxSwift.</p> <p>Start with an introduction to the reactive programmi

www.raywenderlich.com

Section1 까지는 무료로 읽을 수 있다. Section1 까지만 읽어도 RxSwift에 대한 개발감이 잡힌다.

여기서도 Combine(1.6 RxSwift and Combine)에 대해 RxSwift와 비교하며 언급하고 있다.

RxSwift 와 Combine은 아주 유사한 컨셉으로 만들어졌고, 공통된 언어를 많이 사용하고 있다(예를 들면, Publish, Subscribe). RxSwift는 만들어진 역사가 보다 길고(iOS 8부터 지원), 다양한 플랫폼에서 같은 기준을 가지고 만든 언어이기 때문에 어느 플랫폼에서 개발을 하건 동일한 방식으로 개발할 수 있다는 이점이 있다, 반면 Combine은 Apple에서 새롭게 내놓은 iOS 전용 reactive 프레임워크(iOS13부터 지원)이다. Swift언어의 이점을 보다 잘 이용할 수 있고, swift API와 호환성도 좋다.

RxSwift나 Combine을 이용해서 비동기 작업을 개발하고 있다면, reactive 방식을 사용하여 개발하는 것이다. reactive 방식을 사용해서비동기 코드를 작성하면 유지보수가 용이하다.

Combine으로 비동기 개발을 배우고 싶다면 “Combine: Asynchronous Programming with Swift” 책을 읽으라고 링크를 걸어두었다.




RxSwift나 Combine 이전에는 비동기 프로그래밍이 어려웠나?

비동기 프로그래밍이 없는 코드라니, 말도 안된다. iOS 에서도 이미 기존에 비동기 프로그래밍을 위한 API가 존재했다.

iOS 에서 제공하는 비동기 프로그래밍 API

  • NotificationCenter
  • The delegate pattern
  • Grand Cendtral Dispatch
  • Closures
  • Combine(iOS13+)

다만 Combine 이전 까지는 반응형(reactive) 기법이 존재하지 않았을 뿐이다. RxSwift 에서 말하길, iOS에서 제공하는 비동기 프로그래밍은 API 별로 유지보수 및 개발자의 공수가 모두 다르다고 언급한다. 특히 NotificationCenter나 delegate 를 가리치며 유지보수가 힘들다고 말한다.

하지만 실제로 RxSwift를 사용하지 않고 개발할 때, 불편함을 느끼지 않았다. 어쩌면 편한 걸 경험해보지 못해서 불편하다고 못느꼈던 걸 수도 있다. 하지만 각 API는 상황에 따라 사용되는 곳이 달랐고, 적합한 API를 찾는 게 (익숙해져서 그런지) 큰 일은 아니었다. 결국 Apple 에서도 reactive 방식의 프레임워크(combine)을 내놓은 걸 보면, 기본 RxSwift의 이점이 크긴 했던 것 같다.



RxSwift 란?

 

RxSwift is a library for composing asynchronous and event-based code by using observable sequences and functional style operators, allowing for parameterized execution via schedulers.

 

RxSwift는 event 기반의 비동기 작업을 위한 라이브러리이다. observable sequences와 함수형 스타일의 연산자를 이용해서 코드를 작성하고, 스케쥴러(scheduler)에 파라미터를 전달해서 코드가 실행되도록 하는 일을 한다.


책에서 말하는 RxSwift이다.
이게 무슨말 일까.
...
...
차차 알아보자.
주요 키워드는 observable sequences, operator, scheduler 이다.

Foundation of RxSwift

Microsoft 팀에서 비동기 문제를 해결하기 위해 채택한 방식이다. 2009년에 Reactive Extension for .NET(RX)라는 서버를 위한 프레임워크를 제공하기 시작했다. Rx for .NET이 2012년에 오픈소스화 되면서 여러 플랫폼과 언어에 Rx기법이 적용되기 시작하면서 cross-platform 의 기준으로 자리잡는다. 지금은 RxJS, RxKotilin, Rx.NET, RxScala, RxSwift 등 다양한 Rx 플랫폼이 존재한다. - RxSwift: Reactive Programing with Swift 1.2 Foundation of RxSwift -

RxSwift를 알아보기 전에 Rx에 대한 간략한 역사를 볼 수 있다. 위에서 Combine과 비교하면서 언급했듯이, Rx는 Swift만을 위해 만들어진 개념이 아니다. 다양한 플랫폼에서 비동기 문제를 해결하기 위해 나왔다. 그 때 적용되었던 기법과 사용되는 용어는 아래와 같다.

용어

  • State : 데이터, 메모리, 네트워크 등의 환경에 따른 동작 상태(실행, 재시작, 프리징, 종료 등).
  • Imperative Programming : 명령어를 통해 프로그램의 상태를 변경하는 프로그래밍 기법. (강아지 훈련때 명령어를 쓰는 것과 같음)
  • Side effects : 코드가 자신의 영역 밖에 변화를 일으키는 것을 의미. 결국엔 모든 프로그램은 Side effect를 내는 것.
  • Declariative code : 동작을 정의하는 코드 작성법. 비동기 코드에 적용하려면 변경되지않는(immutable) 데이터를 사용하고 순차적으로 간결하게 실행이 되도록 보장해야 한다.
  • Reactive systems 
    • Responsive : UI와 app은 모두 항상 최신 상태 유지해야 한다.
    • Resilient : 모든 동작이 단일로 고립되어 동작해야 하고, 유연하게 에러회복을 해야 한다.
    • Elastic : 다양한 워크로드를 처리하고 구현해야 한다.
    • Message-driven : 컴포넌트가 message 기반으로 통신을 주고 받아야 한다.



지금까지 종합해보면, RxSwift는 유지보수하기 용이한 비동기 코드 작성을 돕고, 2009년부터 여러 플랫폼에 범용적으로 적용된 비동기 처리 방식인 Reactive Extension이 적용된 라이브러리이다.

Rx가 어떻게 비동기를 처리하는 건지 보면 되겠다.



급작스럽지만 글을 마무리한다.(아직 정리가 덜됨 😳)

반응형