article thumbnail image
Published 2022. 11. 25. 01:37

Rx란, Reactive eXtension의 줄임말로,

 

Observable(관찰 가능한) 시퀀스를 사용하여,

비동기식 프로그램 혹은 이벤트 기반 프로그램을 구성하기 위환 오픈 소스 라이브러리이다.

또한, 이런 관찰 가능한 시퀀스를 지원하기 위해 Observer 패턴을 사용한다.

 

아마 해당 문장의 이해가 쉽지 않을 것이다. 이제 이 문장을 천천히 이해해보자! 

 

비동기 프로그래밍

네트워크 통신과 관련한 로직을 "동기적" 으로 짜게 되면, 

아래와 같이 앱의 UI업데이트가 멈추는 현상을 발견할 수 있다. 

 

 

이러한 이유 때문에, 비동기 프로그래밍이 중요한데, 위의 예시를 GCD와 Closure를 통해 비동기 방식으로 짜게 되면, 

func downLoadJson(_ url: String, _ completionHandler: @escaping (String?) -> (Void)) {
    DispatchQueue.global().async {
        let jsonURL = URL(string: url)!
        let data = try! Data(contentsOf: jsonURL)
        let json = String(data: data, encoding: .utf8)
        
        DispatchQueue.main.async {
            completionHandler(json)
        }
    }
}

 

@IBAction func DownLoadButtonPressed(_ sender: Any) {
    downLoadJson(TEST_URL) { jsonData in
        self.textField.text = jsonData
    }
}

 

이렇게 코드가 복잡해진다. 

 

이를 좀더 간결하게 표현하기 위해 반응형 프로그래밍이라는 개념이 도입된다. 

즉 반응형 프로그래밍은 비동기 프로그래밍을 돕는 수단이다.

 

반응형 프로그래밍 (RP) 

반응형 프로그래밍이란, "명령형 프로그래밍" 의 반대가 되는 말로, 이 둘에 대해 먼저 간략히 알아보자.

 

명령형 프로그래밍 : 어떤 값의 상태 변화에 명령을 해줘야 다시 연산을 수행 

반응형 프로그래밍 : 어떤값의 상태 변화에 자동으로 따라서 연산을 수행

 

A가 이벤트(데이터)를 방출하면, (상태 변화)

이를 관찰하고 있는 B가 방출한 이벤트를 통해 연산을 수행한다. 

 

 

 

이를 RxSwift로 변환하면, 아래와 같은 구조가 된다

 

A가 "관찰 가능한 시퀀스"를 통해 이벤트를 방출하면, 

A를 관찰하고 있는 B가 이를 감지하여, 

이벤트를 처리한다.

 

이때, A는 Observable

B는 Subscriber 또는 Observer 가 된다. 

 

또한 위의 그림과 같은 구조를 Observer pattern이라 부른다! 

 

정리를 해보자면, RxSwift는 Observer Pattern을 통해 반응형 프로그래밍을 가능하게 하고, 

이를 통해 비동기 프로그래밍을 지원한다.

 

이러한 RxSwift에서 중요한 개념들이 대표적으로 Observable, Operator, Schedular가 있는데, 이해 대해 여러 포스팅에 걸쳐서 알아보도록 하자.

 

Reference

https://github.com/fimuxd/RxSwift/blob/master/Lectures/01_HelloRxSwift/Ch.1%20Hello%20RxSwift.md

https://reactivex.io/intro.html

곰튀김님 RxSwift강의

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

[RxSwift] Operator(2) - Transforming  (2) 2022.12.27
[RxSwift] Operator(1) - Filtering  (1) 2022.12.25
[RxSwift] Subjects  (0) 2022.12.01
[RxSwift] Observable(2) - Creating Observable  (0) 2022.11.28
[RxSwift] Observable(1)  (0) 2022.11.27
복사했습니다!