ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RxSwift - 개요
    Programming/RxSwift 2022. 3. 3. 23:17

    안녕하세요 BeePeach입니다 :)

    오늘은 RxSwift에 대해서 공부를 해볼 예정입니다.

     

    iOS 공부를 하다 보면 RxSwift는 한 번쯤 들어보셨을겁니다.

    채용공고에도 우대사항에는 꼭 RxSwift 경험 해보신 분이라는 문구가 있죠.

    그래서 많은 신입개발자 분들이 RxSwift를 공부하려고 하실텐데요!

     

    하지만 RxSwift를 왜 공부해야하는지, 언제 사용해야하는지를 모르고 무작정 시작하면 제대로 사용할 수 없습니다.

    그래서 오늘은 RxSwift의 기본 개념에 대해서 공부해보도록 하겠습니다.

     

    이 내용은 적어도 Async(비동기), Sync(동기)의 개념은 알고있어야 이해가 쉽습니다.

     

     


    Rx 사용 이유

     

    RxSwift는 Reactive Programming 아이디어를 Swift에 적용시킨 것입니다.

    왜 Swift에 Reactive의 개념을 적용시켰을까요?

     

    Reactive Programming를 사용하는 이유는 간단하게 설명하자면 Async(비동기)와 MultiThread(멀티스레드)와 관련이 많습니다.

     

    멀티스레드는 Funtional Programming(FP, 함수형 프로그래밍)에서 중점적으로 다루는 문제입니다.

    기기의 성능이 증가하고 여러 프로그램을 동시에 돌릴 수 있게 되면서

    프로그램이 서로에게 영향을 미치지 않도록 Side Effect를 최대한 발생시키지 않게 func을 정의하고 데이터를 적용시키는 방식을 선호하게 됐습니다.

     

     

    출처: https://medium.com/@gauravkumarindia/synchronization-and-race-conditions-with-multi-threading-in-python-2d35930bb61e

    멀티스레드하면 생각나는 주요 문제는 바로 critical section(임계 영역)입니다.

    여러 스레드가 동시에 같은 지점에 `접근만`한다면 괜찮지만 수정을 하는 순간 문제가 발생할 수 있습니다.

    예를들어 어떤 한 스레드에서 값을 수정하고 있는데 다른 여러 스레드에서 도중에 값에 접근을 한다면? 멀티스레드에 대해서 잘 몰라도 뭔가 문제가 발생할 것만 같은 기분이 들죠?

     

    그래서 주로 여러 스레드가 동시에 접근하는것을 막아주는 Semaphore(세마포어) 같은 기법을 사용합니다. 

    (세마포어에 관해서는 여기서 다루지 않습니다.)

     

    그런데 성능향상을 위해서 여러개의 스레드를 사용한건데 막상 그 스레드들이 한번에 동작하지 못하게 하면 원하는 만큼 성능향상이 없겠죠?

    이러한 문제들로 인해서 OOP 이후에 다시 관심을 받게된것이 바로 FP입니다.

     

    FP를 간단하게 살펴보자면

     

    • Data는 Immutable하게 정의하자.
    • Data 변경이 필요하다면 원본으로부터 새로운 데이터를 생성하자.
    • Side effect를 최소화 하기위해서 모든 데이터를 파라미터로 받고 외부 데이터를 변경하지 않는 pure function을 사용하자.
    • 이러한 함수들을 조합하고 고차함수를 이용해서 데이터를 처리하자.

    이러한 특징을 가지고 있습니다.

     

    Reactive를 설명하다가 왜 FP를 설명하는지 의아할 수도 있습니다.

    FP 개념에 따라서 코드를작성하는데 Async(비동기)와 관련된 코드를 작성하려고 보니 몇가지 보완하고 싶은 부분들이 생겨나기 시작했습니다.

     

    그래서 Async 코드를 어떻게 FP적으로 쉽게 다룰 수 있을까??  에서 생겨난 아이디어가 Reactive Programming입니다.

     

     


     

    Rx의 주요 개념

     

    주요 개념은 immutable한 데이터를 stream에 담아서 데이터를 처리하는 것입니다.

    Observable은 input은 없고 output이 stream인 함수입니다.

    Observer는 input으로 stream을 받고 output은 없는 함수입니다.

     

    Observable이라는 generator와 Observer라는 consumer를 서로 stream으로 연결시킨 후

    데이터를 stream을 통해서 전달합니다.

    (RxSwift에서는 stream이라는 말 대신 sequence라는 말을 사용합니다.)

     

    만약 데이터를 변환해야 한다면 중간에 operator를 사용합니다.

    Immutable한 데이터를 담아서 보낸다고 했죠?

    그래서 Operator는 데이터 원본을 수정하지 않고 전달받은 데이터를 가지고 새로운 데이터를 만들어 냅니다.

     

    이 방식을 이용하면 async한 코드를 작성할때 우리는 sync한 코드를 작성하듯 순서대로 읽기 편하게 작성할 수 있게 됩니다.

    (우리가 코드를 작성할때 그렇게 보이는것이지 코드는 async하게 작동합니다.)

    그리고 전달되는 데이터의 원본을 수정하지 않기 때문에 의도하지 않은 side effect를 방지할 수 있습니다.

     

    기존에 Swift에서 비동기 코드를 작성하기 위해서는 completionHandler를 이용하거나 delegate를 사용해서 처리했습니다.

    물론 이 방식이 나쁜 것은 아니지만 이렇게 작성된 코드를 이해하기위해서는 흩어진 코드 이곳 저곳을 돌아다니면서 확인했습니다.

    하지만 Rx를 이용하면 위에서 아래로 흐름대로 읽을 수 있게됩니다.

     


     

    오늘은 이렇게 왜 RxSwift를 사용하는지에 대해서 공부해보았습니다.

    다음 포스팅부터 Observable, Observer에 대해서 알아보도록 하겠습니다.

     


     

    참고자료

     

    https://kxcoding.com

     

    https://reactivex.io

     

    https://github.com/kzaher/RxSwift

     

    https://rxmarbles.com

     

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

     

     

     

    728x90

    'Programming > RxSwift' 카테고리의 다른 글

    RxSwift - Trait  (0) 2022.03.24
    RxSwift - Observable factory  (0) 2022.03.21
    RxSwift - Disposable  (0) 2022.03.17
    RxSwift - Subscribe  (0) 2022.03.17
    RxSwift - Observable  (0) 2022.03.05
Designed by Tistory.