study record
[RxSwift] RxSwift 왜 사용하게 되었나? +(선언적 프로그래밍) 본문
Reactive Programming
Reactive Programming은 데이터의 흐름과 변화의 전파와 관련된 선언적 프로그래밍 패러다임이다. 먼저 데이터 흐름을 정의하고 데이터의 변화를 관찰하다 데이터가 변화했을 때 연관되는 함수나 수식을 업데이트하는 방식이다. 이렇게 비동기적 데이터 흐름을 다루는 프로그래밍으로, 데이터의 이벤트나 UI 이벤트가 많이 발생하는 경우에 장점을 가진다.
또한 Reactive Programming은 비동기적 데이터 흐름과 전달에 관한 프로그래밍 패러다임이라고 표현할 수 있다. 이러한 Reactive Programming의 핵심은 모든 것을 비동기적 데이터의 Stream으로 간주하고, 다양한 방법으로 비동기 이벤트를 처리한다.
프로그래머가 직접 절차를 명시하여 처리하는 명령형 프로그래밍이 아니라 데이터의 흐름을 정의하는 것이 프로그래밍의 핵심이 된다. 시스템 이벤트가 발생했을 때 이를 알아서 처리할 수 있도록 세팅하는 것이다.
특징으로 리액티브 프로그래밍을 기반으로 작성된 프로그램의 특징은 실시간성을 가진다는 것이다. 프로그래머가 작성한 순서대로 돌아가는 방식과는 다르게 사용자의 액션에 상호작용하며 화면이 그에 따라 실시간으로 변하는 것이다. 유튜브의 좋아요 버튼을 누르면 카운트가 바로 올라가게 된다.
이를 실현하기 위해서는 프로그램이 지속적으로 특정 값에 대해 관찰을 해야 한다. 값을 관찰하다가 해당 값에 변화가 일어나면 특정 연산이 이루어져야 하는 것이다. 리액티브 프로그래밍은 변화를 파악하고 화면 혹은 다른 곳에서 적절한 처리를 한다.
스위프트에서는 Callback(closure), delegate, notification 등의 방법으로 비동기 처리를 Reactive하게 처리 할 수 있는 수단을 제공하고 있다. 여러 방법들이 있지만 비동기 작업이 연속될 경우 콜백 지옥을 발생시켜 구조를 복잡하게 만들 가능성이 발생한다. 따라서 관찰 방식을 사용하는 것이 더 효율적일 수 있다.
*선언적 프로그래밍 패러다임이란(declarative programming)? 프로그램이 어떤 방법으로 해야하는지를 나타내기보다는 무엇과 같은지를 설명하는 경우. 함수형 프로그래밍은 선언적 프로그래밍이라는 더 넓은 프로그래밍 패러다임의 한 가지이다. 선언적 프로그래밍은 달성하는 과정을 하나하나 기술하기보다는 필요한 것이 어떤 것인지 기술하는데에 초점을 두고 애플리케이션의 구조를 세워 나가는 프로그래밍 구조이다.
*명령형 프로그래밍 패러다임(imperative programming)? 명령형 프로그래밍은 코드로 원하는 결과를 달성해 나가는 과정에만 관심을 두는 프로그래밍 스타일이다.
명령형(절차적) 프로그래밍은 어떤 일을 어떻게 할 것인가에 관한 것이고, 선언적 프로그래밍은 무엇을 할 것인가에 관한 것이다.
RxSwift
RxSwift는 Reactive Extension Swift의 합성어로, 함수형 프로그래밍인 Swift에 반응형 프로그래밍을 더해주는 라이브러리, 비동기 프로그래밍을 관찰가능한 흐름으로 지원해주는 프레임워크이다. 옵저버 패턴과 이터레이터 패턴, 함수형 프로그래밍을 조합한 반응형 프로그램이다.
또한 반응형 프로그래밍이 제공하는 명확함, 비동기를 동기화된 것처럼 작성이 가능해서 일관성이 없는 비동기 코드를 하나의 비동기 코드로 개발할 수 있다. 이렇게 Rx로 일관된 코드를 작성하면서 확장이 불가능한 아키텍쳐 패턴을 해겨할 수 있고, 서로 다르게 구현한 로직을 조합하기 쉽다.
그리고 Thread 처리가 쉬워지고, 콜백지옥에 빠지지 않고 가독성 높게 코드를 작성할 수 있다. 만약 RxSwift를 사용하지 않는다면 하나의 결과를 받은 후 발생해야 하는 이벤트, 그 이후의 이벤트 이렇게 콜백 지옥이 코드에 나타나게 된다.
RxSwift는 Observable, Disposable 타입이 필수적이다.
Observable은 이벤트를 시각적인 흐름에 따라 전달하는 전달자 역할을 한다. 비동기로 동작하는 데이터들의 흐름, 시퀀스를 말한다. 3가지 타입의 이벤트(next, error, sompleted)들을 방출한다. 이 Observable을 구독하는 Observer들은 이벤트들을 받아 적절한 처리를 할 수 있게 된다.
Disposable 변수는 이벤트 취소를 처리하는 것으로 작업이 끝난 후 처분할 수도 있고 작업 도중에 처리할 수도 있다. 여러 개의 비동기 작업을 한 번에 취소하고 싶을 때는 DisposeBag에 모아서 사용할 수 있다.
RxSwift의 단점
- 러닝커브가 높은 편이다.
- 작동 기반이 비동기로 이루어져 디버깅이 어렵다.
- 클로저 사용이 많아 메모리 누수 및 순환참조가 일어날 수 있다. 이를 막기 위해 캡처리스트에 신경을 써야 한다.
참고 :
https://github.com/lunchScreen/Interview_Questions/issues/38
https://github.com/lunchScreen/Interview_Questions/issues/67
'iOS > RxSwift' 카테고리의 다른 글
[RxSwift] Driver란? (0) | 2022.03.29 |
---|---|
[RxSwift] Subject와 Relay (0) | 2022.03.14 |
[RxSwift] Subject의 종류 (0) | 2022.03.11 |
[RxSwift] Observable과 Subject 차이 (0) | 2022.03.05 |
[RxSwift] Hot Observable과 Cold Observable의 차이 (0) | 2022.03.04 |