iOS

[RxSwift] ReactiveX가 뭘까

Gyunorld 2025. 1. 17. 20:23

iOS개발자 채용 공고의 우대사항

요즘 지원을 위해서 여러 곳의 채용 공고를 보다가 우대사항에 자주 보이는 단어가 있었다. 바로 RxSwift라는 단어가 자주 보였다. 도대체 RxSwift가 뭐길래 이렇게 다들 우대사항에 적어놓았는지 궁금증이 생김에 Rx가 뭔지 알아보기로 했다.

🤷‍♂️ReactiveX란?

An API for asynchronous programming with observable streams

ReactiveX의 메인 페이지에 나와있는 문장이다. 해석해보자면 "Observable 스트림을 활용한 비동기 프로그래밍 API"라는 말이다. 데이터가 비동기적으로 생성되고 흐르는 스트림(stream) 형태로 다룰 수 있도록 지원하며, 개발자가 이런 스트림을 쉽게 관찰(observe), 변환(transform), 결합(combine)할 수 있도록 도와준다. 그리고 ReactiveX라는 이름에서 알 수 있듯이 주로 반응형 프로그래밍(Reactive Programming)에서 사용된다. 여러가지 개념들이 한 번에 나오니 복잡한데 한가지씩 나누어 보겠다.

✅ 반응형 프로그래밍(Reactive Programming)

비동기 데이터 흐름에 기반을 둔 프로그래밍의 패러다임이다. 객체지향,함수형 프로그래밍처럼 방법론 중 하나이다. 반응형 프로그래밍의 가장 큰 특징은 데이터의 변화가 발생했을 때 연결된 모든 연산에 전파되도록 설계되었다는 것이다. 가장 쉽게 이해할 수 있는 방법 중 하나는 스프레드 시트이다. 예를 들어 스프레드 시트에서 C1 = A1 + B1 이라는 함수를 만들었다. A1과 B1에 숫자를 변경하면 C1의 값은 자동으로 변경된다.

반응형 프로그래밍의 장점


  • 선언적 코드
    • 데이터를 어떻게 처리할 지에 집중하며, 대부분 상태 변화가 자동으로 이루어진다.
  • 비동기 처리 단순화
  • 유지 보수성 향상
  • 유연성
    • 다양한 데이터 소스를 통합하고, 동적으로 조작 가능하다.

위의 장점들로 인해서 주로 실시간으로 데이터를 처리하거나 데이터의 상태 변화에 따라서 UI의 변화가 필요할 때 주로 사용된다. 이런 특징들이 모바일 앱에서 중요하기 때문에 많이 사용되는 것 같다.

✅ 비동기 처리

위에서부터 계속해서 나오는 단어가 "비동기"이다. 비동기 처리란 작업을 요청한 뒤에 해당 작업이 완료될 때까지 기다리지 않고 동시에 다른 작업을 수행하는 것이다. 예를 들어서 설명하자면 유튜브 뮤직으로 노래를 들으면서 블로그를 보면서 카톡의 알림을 받는 행위가 동시에 이루어지는 것이 비동기이다. 만약에 동기로 이루어진다면 유튜브 뮤직에서 노래가 끝나야 블로그를 볼 수 있을 것이다. 간단하게 설명하자면 비동기는 병렬, 동기는 직렬이라고 할 수 있다.

비동기 처리의 장점


  • 응답 속도 개선
    • 시간이 오래 걸리는 작업이 있어도 기다리지 않고 다른 작업을 실행 할 수 있다.
  • 사용자 경험 향상
  • 리소스 효율성
    • 작업을 기다리는 동안 CPU와 메모리가 다른 작업을 수행 할 수 있다.

비동기 처리의 단점으로는 메모리 누수 위험, 성능 저하, 코드 복잡성 증가등이 있다.

✅ 다시 ReactiveX로 돌아오자!

이제 다시 ReactiveX로 돌아오자!

"Observable 스트림을 활용한 비동기 프로그래밍 API" 

처음에 Rx의 공식 홈페이지에 나와있던 문장에서 한 개의 단어를 제외하고 위에서 모두 설명했다. 마지막으로 Rx의 핵심이자 마지막 단어인 Observable을 보자! Rx의 공식 홈페이지에 Docs탭을 누르면 5가지의 단어가 나온다. Observable, Operators, Single, Subject, Scheduler를 설명해주는데 이중에서 핵심인 Observable을 중심으로 설명해보겠다. 

🔭 Observable

Observable은 관찰자(Observer)가 구독하는 대상이다. 아래는 공식 문서에서 Observable에 대해서 설명할 때 사용하는 마블 다이어그램이다.  그림에서 두 개의 선은 시간의 흐름을 의미한다. 위의 선은 Observable의 시간의 흐름이다.선 위에 위치한 도형들이 Observable에 의한 데이터 변화이다. 아래의 선은 데이터 변화의 결과를 표현한 것이다. 

마블 다이어그램

사실 그림을 보고도 감이 안 온다...🤦 

나름대로 공부하고 사용하고나서 내가 생각한대로 정리해본다면 Observable은 관찰 가능한 대상이다. 관찰자가 Observable을 구독해서 이벤트가 발생하는 순간에 알림을 받아서 연산을 실행한다. 여기서 핵심은 관찰자가 Observable을 구독한다고 해서 계속 지켜보는 것이 아니라 변화가 발생했다고 알림이 오는 순간에 연산을 실행하기 때문에 동시성 연산이 가능하다. 

🧮 Operator(연산자)

Operator는 Observable의 여러 메서드를 조합시켜준다. 연산자라는 단어처럼 메서드를 조합해주는 역할을 해준다. 연산자는 Observable의 생성, 변환, 필터링, 결합, 오류처리등 다양하다. 다 설명하면 너무 많기 떄문에 간단하게 Operator의 역할만 소개하고 넘어가도록 하겠다. 혹시나 궁금하다면 아래의 문서링크를 참고하기 바란다.

Rx 연산자 공식 문서 :  https://reactivex.io/documentation/ko/operators.html#categorized

 

💾 Scheduler

Scheduler는 여러 작업을 비동기적으로 실행하고 결과에 따라서 다음 동작을 정해준다. Swift의 DispatchQueue와 유사하다. 차이점이라면 DispatchQueue를 사용할 때와 달리 따로 쓰레드를 지정할 필요가 없다. RxSwift의 내부에 자체적으로 Scheduler를 통해서 처리하기 때문에 특수한 경우를 제외하면 자체적으로 처리한다.

 

이렇게 복잡한 Rx를 왜 이렇게 많이 사용하는 것일까? 기본적으로 Rx는 반응형과 비동기 처리의 장점을 모두 가지고 있기 때문이다

ReactiveX의 장점

  • 비동기 프로그래밍 지원 : 콜백 지옥(callback hell)을 피하고, 코드 가독성을 높일 수 있다.
  • 스트림 기반 데이터 처리 : 이벤트나 데이터를 스트림 형태로 처리하며, 데이터를 실시간으로 변환, 필터링, 합성할 수 있다.
  • 선언형 프로그래밍 : 복잡한 데이터 흐름을 간결하고 명확하게 표현할 수 있다.
  • 조합과 변환의 용이성 : 다양한 연산자를 통해 데이터를 손쉽게 변환하고 결합할 수 있다.
  • 동시성 처리 간소화 : 스레드 관리가 쉽고 스케줄러를 간편히 지정할 수 있다.
  • 에러 처리 간소화 : 에러를 스트림의 일부로 취급하여 코드 흐름을 방해하지 않으면서도 체계적으로 예외를 처리할 수 있다.
  • 재사용성과 모듈화 :  연산자를 활용한 데이터 흐름 처리가 모듈화되어 코드의 재사용성을 높이고 유지보수를 용이하다.

다양한 장점 때문인지 지원하는 언어의 목록이 어마어마하다.

지원하는 언어 목록

ReactiveX의 단점

물론 단점도 있다. 설명하기 쉬운 단점은 바로 성능 문제이다. 잘못된 연산자 사용이나 불필요한 스트림 생성으로 성능 저하 문제를 발생시킬 수 있다. 불필요하게 여러 비동기 처리를 하게 되면 메모리의 사용량이 증가하여 성능을 저하시킬 것이다. 다른 단점 하나는 이 글을 다 읽었다면 이해할 수 있다. 바로 학습이 어렵다는 것이다. 검색을 통해서 여러 자료들을 조사하면서 가장 많이 본 단점이 바로 학습 곡선이 가파르다는 것이었다. 너무 많은 개념을 처음부터 다 이해해야 하기 때문에 쉽지 않다.

'iOS' 카테고리의 다른 글

Firebase Auth에서 카카오 로그인 사용하기  (0) 2025.02.26
앱스토어에 앱 등록하기  (3) 2024.12.18
[iOS] 첫 번째 앱 개발기록 - "글력"  (0) 2024.12.17