[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🍎 Apple/Combine & Rx

[RxSwift] Reactive Programming & RxSwift

inu 2022. 1. 2. 16:17
반응형

부스트캠프에서 만난 팀원들과 하는 스터디의 이번주 주제 중 하나는 'RxSwift를 왜 사용하는지 설명하시오.'였다.

 

그런데 막상 공부하려고 보니 아직 Reactive Programming에 대해서도 정확히 파악하고 있지 못함을 느꼈다. (저번에 스터디도 했는데... 더 열심히 해야겠다...🥲 ) 그래서 이번 기회에 Reactive Programming와 RxSwift의 간단한 개념, 그리고 RxSwift를 왜 사용하는지와 단점까지 차례대로 정리해볼까 한다!

Reactive Programming

Reactive Programming이란 비동기적 데이터 흐름과 전달에 관한 프로그래밍 패러다임이다. 이러한 Reative Programming의 핵심은 모든 것을 비동기적 데이터의 Stream으로 간주하고, 다양한 방법을 통해 이러한 비동기 이벤트를 처리하는 것이다.

 

프로그래머가 직접 절차를 명시하여 처리되는 Imperative Programming과는 다르게 데이터의 흐름을 정의하는 것이 프로그래밍의 핵심이 된다. 프로그래머가 특정 기능을 직접 정해서 실행되도록 처리하는 것이 아니라, 시스템 이벤트가 발생했을 때 이를 알아서 처리할 수 있도록 하는 것이다.

 

사용자의 입장에서는 Reative Programming을 기반으로 작성된 프로그램은 '실시간성'을 가진다. 프로그래머가 작성한 순서대로 돌아가는 방식과는 다르게 사용자와 상호작용하며 그에 따라 화면이 '실시간으로' 변하는 것이다. 예를 들어 유튜브에서 특정 동영상에 좋아요를 누르면 페이지를 새로 불러오지 않아도 바로 카운드가 올라간다.

 

이를 실현하기 위해서는 프로그램이 지속적으로 특정값에 대한 관찰을 해야한다. 값을 관찰하다가 해당 값에 변화가 일어나면 특정 연산이 이루어져야 하는 것이다. 사용자는 다양한 방법으로 해당 값에 비동기적으로 변화를 주는데, Reactive Programming에서는 이를 바로 파악하고 화면 혹은 다른 곳에 적절한 처리를 수행한다.

 

사실 이러한 비동기 처리를 위해 관찰이 아닌 단순 Callback 함수를 사용할 수도 있다. 하지만 이는 비동기 작업이 연속될 경우 Callback 지옥을 발생시켜 구조를 복잡하게 만들기 때문에 관찰방식을 사용하는 것이 보통 더 효율적이다.

RxSwift & ReativeX

본격적으로 ReativeX에 관해 알아보기에 앞서 'Functional Reactive Programming'에 대해 간단하게 알아보자. Functional Reactive Programming는 Reactive Programming을 Funtional하게 구현하는 것을 말한다. 비동기적 데이터처리를 간단한 함수를 통해 수행할 수 있도록 하는 것이다. 단 이 경우, Funtional Programming 패러다임에 맞게 Side Effect가 발생하지 않는 순수함수로 만들어야 한다.

 

Functional Reactive Programming의 원리를 기반에 두고 비동기적 이벤트를 간단하게 처리하기 위해 만들어진 API, 그것이 ReativeX이다. 비동기 이벤트를 순수함수로 간단하게 처리할 수 있도록 구현되어 있다. Rx에서는 모든 것이 Data Stream이며, 이를 Observable이라고 표현한다. Rx는 이러한 Observable의 변화를 관찰하기 위해 이를 Subscribe한다.

 

RxSwift는 이러한 ReativeX를 Swift에서 구현한 것이다. (RxJs, RxJava, RxSwift, RxKotlin, RxPY, RxScala, RxPHP, RxNetty, RxRuby, RxRust 등 다양한 언어에서 Rx가 구현되어 있다.)

RxSwift를 사용하는 이유

  • Reactive Programming된 API를 제공하기 때문에 명확하고 명시적으로 비동기 데이터를 처리할 수 있다.
  • 다양한 비동기 처리방식을 하나로 통합함으로써 코드에 일관성을 제공한다.
  • 결국 확장이 어려웠던 아키텍처 패턴까지 해결할 수 있다.
  • 콜백 지옥에서 탈출하여 코드가 깔끔해지고 스레드관리가 용이해진다.

RxSwift의 단점

  • 러닝커브가 높다.
  • 작동 기반이 비동기로 이루어져 있어 디버깅이 어렵다.
  • 클로저 사용이 많기 때문에 메모리 누수 및 순환참조가 일어날 수 있다. 이를 피할 수 있도록 캡처 리스트를 신경써야 한다.

참고

반응형