[RxSwift] Reactive-X란?

CastleSilver·2023년 4월 16일
0

Reactive X

목록 보기
1/7

공식 홈페이지에서는 Reactive X에 대해 다음과 같이 설명하고 있습니다.

Reactive X는 Observable sequence를 이용해 이벤트 기반의 비동기적인 프로그램을 구성하는 데 도움을 주는 라이브러리입니다.

처음부터 모르는 용어가 너무 많이 등장하기에, Reactive X의 개념에 앞서 이 용어들을 정리해보겠습니다.

비동기적 프로그래밍이란?

비동기적인 프로그래밍(Asynchronous Programming)이란 프로그램이 동시에 여러 작업을 처리할 수 있도록 하는 프로그래밍 기법을 의미합니다. 동기적인 프로그래밍은 한 작업이 끝나야 다음 작업을 수행할 수 있는데 비해, 비동기적인 프로그래밍은 한 작업이 끝나기를 기다리지 않고 다음 작업을 수행할 수 있습니다.

예를 들어, 파일을 읽어오는 작업이 있다고 가정해봅시다. 동기적인 프로그래밍에서는 파일을 읽어오기 위해 파일이 완전히 읽혀질 때까지 기다렸다가, 다음 작업을 수행합니다. 하지만 비동기적인 프로그래밍에서는 파일을 읽어오는 작업을 수행하는 동안 다른 작업을 수행할 수 있습니다. 이를 통해 시간을 절약하고, 프로그램의 성능을 향상시킬 수 있습니다.

이벤트 기반 프로그래밍이란?

이벤트 기반 프로그래밍(event-based programming)이란 이벤트를 중심으로 프로그래밍을 구현하는 기법을 의미합니다. 이벤트는 사용자 입력, 네트워크 통신, 파일 입출력 등 소프트웨어에서 발생하는 모든 사건을 의미합니다.

이벤트는 발생하는 시점에 따라 동기적으로 처리될 수도 있고, 비동기적으로 처리될 수도 있습니다. 이벤트가 발생하면, 이를 처리하는 콜백 함수를 호출하거나, 이벤트 큐에 등록하여 나중에 처리할 수 있습니다.

이벤트 기반 프로그래밍은 대규모 시스템 및 분산 시스템에서 많이 사용되고 있습니다. 예를 들어, Node.js에서는 이벤트 기반의 비동기 I/O 모델을 사용하여 높은 처리 성능을 달성하고 있습니다.


Reactive X의 특징

Observer Pattern

ReactiveX는 observer pattern을 사용하여 데이터나 이벤트의 시퀀스(시간에 따라 발생하는 데이터나 이벤트의 순서적인 연속성)를 지원하며, 이를 구성하는 함수형 연산자를 제공합니다. 이를 이용하여 시퀀스를 추상화하고, 저수준의 스레딩, 동기화, 스레드 안전성, 동시성 데이터 구조, 비차단식 I/O 등과 같은 문제를 추상화할 수 있습니다. 이러한 추상화는 개발자가 더욱 쉽게 비동기적인 이벤트 처리를 구현할 수 있도록 도와줍니다.

다음은 RxSwift에서 Observable을 생성하는 예제입니다.

import RxSwift

let button = UIButton()
let clicks = button.rx.tap.asObservable()
clicks.subscribe(onNext: { _ in
    print("Clicked!")
})

위 코드에서 rx.tap 속성을 이용하여 버튼 클릭 이벤트를 Observable sequence로 변환합니다. subscribe 함수를 호출하여 클릭 이벤트가 발생할 때마다 'Clicked!'라는 메시지를 출력할 수 있습니다.

가장 이상적인 방법으로 비동기적으로 여러 개의 아이템을 처리

Observable<T> getData()은 비동기적으로 여러 개의 아이템을 처리할 수 있습니다. 그렇지만 지속적으로 변화하는 값에 대해 작동하는 "functional reactive programming"과 달리 ReactiveX는 시간에 따라 발생하는 이산적인 값을 처리합니다. 다시 말해서, 이벤트나 데이터가 발생할 때마다 시간적인 연속성이 아닌 개별적인 이벤트나 데이터로 처리합니다.


Observable을 사용하는 이유

Observable을 사용한다면 마치 배열을 만드는 것과 같이 간단한 작업으로 비동기 이벤트의 스트림을 처리할 수 있습니다. 이를 통해 콜백(함수를 다른 함수의 인자로 넘겨주는 것)의 복잡한 연결에서 벗어나 코드의 가독성을 높이고 버그 발생률을 낮출 수 있습니다.

낮은 구현 난이도(Composable)

Java Futures는 단일 수준의 비동기 실행에 대해서는 간단하게 사용할 수 있지만, 중첩될 경우 상당히 복잡해집니다.

반면 ReactiveX Observables는 비동기 데이터 시퀀스를 위해 고안되었으며 이를 위해 다양한 연산자를 제공합니다. Observable을 통해 비동기 실행 흐름을 보다 간단하게 구성할 수 있으며, 중첩된 콜백의 복잡성을 피할 수 있습니다.

유연성(Flexible)

ReactiveX Observables는 단일 값의 배출(Observable이 Observer로 데이터를 전달하는 행위)뿐만 아니라 여러 값 또는 무한 스트림의 배출도 지원합니다. Observable은 이러한 모든 사례에 사용할 수 있는 유일한 추상화입니다.

중립성(Less Opinionated)

ReactiveX의 Observables는 특정한 동시성 또는 비동기성 소스에 얽매이지 않습니다. Observables는 thread-pools, event loops, non-blocking I/O, actors(such as from Akka) 등 다양한 방식으로 구현될 수 있습니다. 즉, 구현 방식이 블로킹 또는 논블로킹인지, 어떻게 구현되었는지 등에 대해 Observer는 신경쓰지 않아도 됩니다. 따라서 나중에 Observable의 코드를 변경하더라도 Observer의 코드는 변경하지 않아도 됩니다.

profile
우당탕탕 비전공자 개발자

0개의 댓글