Why "RxSwift"?

wani·2020년 8월 4일
0

Rx란?

Reactive Extension을 사용한 라이브러리.

만약 단순하게 비동기 코드를 작성하고자 한다면 크게 다음과 같은 두가지 문제가 발생한다.

  1. 각 동작들의 순서를 결정하기가 힘들다.
  2. 공유자원에 대한 처리방법이 필요하다.

물론 Rx를 사용하지 않아도, 두가지 문제를 해결하기 위한 방법들은 많지만, Rx에서 제공하는 라이브러리를 사용하면 보다 간결한 코드로 같은 이점을 얻을 수 있다.

이러한 Rx는 처음엔 웹에 사용될 목적으로 개발됐으나, 오픈소스화되면서 다양한 언어들로 개발되었고, RxSwift도 이 중 하나다.

"Reactive Programming ≠ Rx"


1. Reactive Programming을 쉽게 할 수 있도록 돕는다.

(RxSwift를 사용하지 않아도 동일한 Reactive Programming을 구현할 수 있지만, RxSwift를 사용하면 이를 훨씬 간단하게 구현할 수 있다.)

Reactive Programming과 Rx

Reactive Programming은 미리 데이터의 흐름과 그에 대한 처리를 만들어 놓고, 흐름이 바뀌었을 때 만들어둔 방식에 따라 변화를 주는 프로그래밍 방식.

실시간화

예를 들어 명령형 프로그래밍에서는 c = a+b라는 함수가 있을 때, c는 a+b의 결과물이 되며, a나 b의 값이 변경되어도 재연산 명령이 들어오지 않는한 갱신되지 않는다.

반면에 reactive programming에서는 a와 b의 값이 바뀔 때마다 c의 값이 바로 재연산되어 갱신된다.

즉, Reactive Programming의 핵심은 DataBinding을 통해 Model과 View, Input과 Output이 업데이트 상황을 실시간으로 공유하며 업데이트하는 프로그래밍 방식.

다수의 비동기 이벤트를 처리하는데 용이함.

Rx를 사용하는 주된 이유.

Reactive Programming은 기본적으로 비동기를 포함한 모든 Event들을 Stream으로 본다.

(여기서 스트림이란 시간 순서로 전달되어지는 값들의 Collection)

만약 일반적인 명령형 프로그래밍으로 다수의 비동기 이벤트들을 처리하려면, 여러 콜백을 중첩시키거나 (콜백지옥), 플래그 변수나 if문을 여러번 사용해야 한다.

하지만 RxSwift를 통한 Reactive Programming의 경우, 별도로 제공되는 라이브러리 함수를 사용하기 때문에, 콜백중첩으로 표현하는 구문보다 훨씬 간결하게 같은 내용을 표현할 수 있다.

또한 위와 같은 플래그 변수나 if문 사용했을 때 발생할 수 있는 실수를 줄여 준다.


2. Rx는 앱을 선언형(함수형)으로 개발할 수 있게 해준다.

Functional Reactive Programming

RxSwift 없이도 함수형 프로그래밍은 가능하지만, Rx에서 비동기 처리에 제공되는 함수들이 filter, map 등의 함수들과 같이 사용하기 쉽도록 설계되어 있기 때문에, 보다 함수형으로 개발하는데 용이하며, 함수형 프로그래밍의 장점을 그대로 가져올 수 있다.

함수형 프로그래밍

https://www.youtube.com/watch?v=jVG5jvOzu9Y

함수형 프로그래밍은 어떤 문제를 해결할 때, 그 과정에 집중하여 작성하는게 아니라, 미리 만들어놓은 함수(Side-effect가 없는)들을 조합하고 재사용하여 코드를 구성하는 방식이다. 특히 Swift와 같은 함수형 언어에서는 함수를 1급객체로 취급하기 때문에, 함수 자체를 매개변수나 반환값으로 쓸 수 있고, 이에 대하여, filter나 reduce 등을 통해 고차함수로 활용할 수 있다.

함수형으로 프로그램을 작성하면, 함수 내에서 외부 값을 참조하는 빈도가 줄고, 이로인해 보다 많은 값들을 Immutable하게 사용할 수 있기 때문에, Side-Effect가 훨씬 줄어들고 이에 따라 보다 안정적으로 프로그래밍할 수 있게 된다.

멀티스레드 상황에 특히 유리

비함수형 프로그래밍에선, 하나의 공유자원에 여러 스레드가 접근하는 경우 race-Condition이 발생하기 때문에 Lock을 걸어주는 등의 방법으로 해결함. → 오버헤드가 크고 프로그램이 느려진다.

함수형의 경우 Immutable한 데이터 자체를 복사해서 input값으로 사용 → output으로 배출하여 update하는 방식이기 때문에, 여러 스레드에서 공유자원에 접근한다고 해도 오버헤드가 작으며, 소스도 훨씬 간결해진다.


3. MVVM 디자인 패턴과 궁합이 좋다.

MVVM

[Swift] MVVM 디자인 패턴과 RxSwift

응용 프로그램의 구성요소를 Model, View, ViewModel 로 구분하는 소프트웨어 디자인 패턴. 이 때, VIewModel은 VIew와 Model 사이에 위치하여 둘을 연결한다.

즉, ViewModel은 View의 변화에 따라 Model을 업데이트하고, 모델에서 Update된 값을 다시 View에 표시하는 역할을 갖는다.

데이터를 View로 바인딩하는 방법은 여러가지 존재하는데, 일례로 Swift에서 자체적으로 Observer를 지원하기도 한다.

하지만, 단순히 데이터의 변경사항 뿐만 아니라, 네트워크 요청과 같은 비동기 작업, 혹은 이벤트/알림 같은 작업도 함께 처리해야 하는 경우가 많기 때문에, 이 때 RxSwift가 가장 많이 사용된다.

profile
🍃

0개의 댓글