RxSwift에서 Rx는 ReactiveX를 뜻합니다. 여기서 Reactive는 Reactive Programming에서 따온 것입니다. 이번 포스팅에서는 반응형 프로그래밍 혹은 함수형 프로그래밍이라고 불리는 프로그래밍 방식에 대해서 알아보도록 하겠습니다.

반응형 / 함수형 / 선언형 프로그래밍

반응형 프로그래밍

로직이나 데이터를 비동기적인 흐름(Stream)으로 보는 프로그래밍 방식입니다. 기존의 프로그램의 비동기 작업을 처리하는 방식이 선행하는 비동기 작업이 끝나면 다음 Callback 함수를 실행하는 방식이었다면 반응형 프로그래밍에서는 선행 작업이 이벤트를 발행하면 다음 작업이 구독하여 실행되는 방식입니다.

Stream

비동기적인 흐름이라는 것이 약간 모호한 설명입니다. 몇 가지 예시를 들어보겠습니다.

  1. 시간의 흐름: 일정 시간마다 실행되는 코드의 경우 해당 시간 마다 이벤트를 발행하게 됩니다. 해당 이벤트의 연속을 하나의 흐름으로 볼 수 있습니다.
  2. 사용자 입력 (User Input): 사용자의 입력들을 하나의 흐름으로 볼 수 있습니다. 예를 들면 사용자가 화면을 터치할 때 이벤트를 발행하고 특정 객체가 해당 이벤트를 구독해서 작업을 수행하는 식입니다.
  3. Network: 네트워크에서 오는 데이터 역시 하나의 흐름으로 볼 수 있습니다. 특히 요즘 많이 볼 수 있는 동영상, 음악 스트리밍은 데이터를 하나의 흐름으로 처리하는 방식의 좋은 예시로 볼 수 있습니다.

함수형 프로그래밍이란?

함수형 프로그래밍은 변수의 사용을 지향하고 순수 함수만을 활용해서 코딩하는 것을 지향하는 코딩 방식입니다.

순수함수

순수함수는 부수적인 효과를 가지지 않는 함수입니다. 즉 외부 상태에 관계없이 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수입니다. 또한 외부 상태를 변경하지도 않는 함수입니다.

순수함수의 장점은 Thread Safety입니다. 외부 상태에 영향을 주지도 받지고 않기 때문에 멀티쓰레딩 환경에서 안전합니다.

우리가 RxSwift를 사용할 때 순수함수를 직접 구현하지는 않습니다. RxSwift라는 라이브러리 안에 이미 구현된 순수함수들을 가져다가 사용하면 됩니다.

선언형 프로그래밍

반응형, 함수형 프로그래밍과 함께 선언형 프로그래밍이라는 용어도 쓰입니다. 이 용어는 명령형 프로그래밍의 대척점에 서있는 용어라고 할 수 있겠는데요. 코드를 예시로 설명을 드려보겠습니다.

명령형 프로그래밍은 기존의 프로그래밍 방식과 같습니다. 코드 한줄한줄이 하나의 명령을 의미합니다.

var num = 0 // num이라는 변수에 0을 할당하라
num = num + 1 // num에 1을 더해라
print(num) // num을 출력하라

선언형 프로그래밍은 선언의 형식을 가집니다. 여러 개의 명령으로 구성되는 코드와는 다르게 하나의 코드를 여러 수식어를 붙여 선언하는 형식을 가집니다.

Observable.just(0) // 0에서
    .map {
        return $0 + 1 // 1을 더한 것이 (선언)
    }.subscribe(onNext: {
        print($0) // 발행되면 출력한다.
    })

ReactiveX

정의

ReactiveX의 홈페이지에 가보면 정의가 아래처럼 나와있습니다.

ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.

풀어 설명하자면 Observable의 연속을 활용해서 비동기, 이벤트 방식의 프로그램을 구성하는 것을 돕는 라이브러리라는 것이죠. 이렇게 설명하니까 어렵네요... 아래 구성 요소를 보는 것이 이해가 빠릅니다.

구성요소

ReactiveX의 구성요소를 크게 정리하면 3가지로 나눌 수 있습니다.

Observable.of(1,2,3,4,5) //👉 Observable
    .map { return $0 * 2 } // 👉 Operator
		.subscribe(onNext: { print($0) }) //👉 Observer

Observable

데이터를 발행하는 주체입니다. 하나의 데이터를 발행할 수도 있고 여러 데이터를 발행할 수도 있습니다. 이 데이터들은 위에서 말한대로 stream이라고 불립니다.

Operator

데이터를 조작하는 연산자들입니다. 발행되는 데이터들은 연산자를 거치면서 다양하게 변형되거나 필터링되거나 하나로 합쳐질 수 있습니다. ReactiveX 라이브러리는 다양한 연산자를 제공합니다.

Observer

데이터를 기다리고 있다가 최종작업을 수행하는 역할입니다.

마치며...

약간 추상적인 용어들을 말로 정리하는게 쉽지는 않네요. 머리 속으로는 이해하고 있는 내용이지만 블로그에 정리하고 퇴고를 해봐도 너무 투박하게 정리한 것 같습니다.

앞으로 RxSwift를 공부하며 필기한 내용을 블로그에 옮겨 정리할 예정입니다.

profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글