티스토리 뷰
RxSwift에 대한 공부를 시작하려고 합니다.
먼저 왜 RxSwift를 사용해야하는지, 왜 RxSwift에 관심을 갖게 되었는지 말씀드리고자합니다.
네트워크를 통한 데이터 통신이 잦아지면서 비동기 처리를 해야했고, 탈출 클로저(@escaping)을 통한 completionHandler 처리를 해주어야 했습니다. 하지만 비동기 처리의 중첩 등의 이유로 탈출 클로저를 통한 함수 생성은 복잡하기도 하고 사실 매번 만드는데 조금 귀찮아지기도 했습니다....
그래서 비동기 처리를 쉽고 간결하게 할 수 있는 방법을 찾아보던 도중 비동기 프로그래밍을 위한 라이브러리를 알게 되었습니다.
비동기 프로그래밍을 위한 라이브러리는 대표적으로 Promise, Bolt, RxSwift 이 있습니다. UIKit과 함께 사용됩니다.
또 Apple에서 제공하는 RxSwift와 유사한 Combine이 있습니다. SwiftUI와 함께 사용됩니다.
그 중 저는 RxSwift에 대해 알아보려고 합니다.
RxSwift는 Rx + Swift입니다.
Swift에 Rx를 접목 시킨 것이죠.
그렇다면 Rx란?
Rx는 Reactive eXtension의 축약것입니다.
간단한 정의로는, '반응형 프로그래밍을 특정 언어에 접목 시키기 위한 것' 으로 해석할 수 있습니다.
즉, RxSwift는
'함수형 프로그래밍인 Swift에 반응형 프로그래밍을 더해주는 라이브러리' 로 해석할 수 있겠습니다.
어려운말 투성이이 인데 천천히 알아 보겠습니다.
* 함수형 프로그래밍
외부의 변수의 상태나 값을 변경하지 않고 함수를 통해 결과를 도출하는 방법을 이용한 프로그래밍
물론 함수 내부에서는 변수의 상태나 값이 변할 수 있지만, 이 함수를 받아오는 곳에서는 변하지 않습니다.
선언형으로 구현 가능하다는 특성을 가집니다. 선언형에 대해서는 잠시 후에 다시 다루겠습니다.
* 반응형 프로그래밍
스트림으로부터 나온 값에 구독자가 반응하여 특정 작업들을 처리합니다.
흐름을 선언해두고 그에 맞는 작업이 진행되어 값이 산출됩니다.
함수형 + 반응형 프로그래밍으로 매우 간결한 코드를 구현할 수 있게 됩니다.
그렇다면 ReactiveX를 사용하는 이유는 무엇일까요?(Why ReactiveX?)
0. 일반적인 타입뿐만 아니라 시간의 흐름, 사용자의 동작(이벤트), 네트워크의 요청 결과 모두 스트림으로 만들 수 있습니다.
특정한 '값'(Int 타입의 1, 2, 3 ---, String 타입의 "ab", "cd" 등)뿐 만 아니라, 사용자에 의한 버튼 터치라던지, 몇 초 후에 어떤 이벤트가 발생한다던지 하는 것을 모두 스트림으로 만들 수 있습니다.(스트림에 대해서는 추후의 챕터에서 공부하겠습니다.)
1. 비동기를 동기화 된 것 처럼 사용할 수 있다
일반적으로 비동기는 callback을 받는 방법을 사용합니다. Swift에서는 @escaping 등을 이용합니다.
비동기가 중첩이되면 굉장히 복잡한 구조가 되는데, 이러한 구조적인 문제를 해결해줍니다.
이러한 비동기 함수를 @escaping 없이 어떠한 타입으로 리턴 받아 하나의 인스턴스로 사용할 수 있도록 해줍니다.
이로인해 자연스럽게 로직이 쉬워집니다.
2. App 을 선언형(Declarative)으로 사용할 수 있습니다.
선언형과 비교되는 명령형 이라는 것이 존재합니다. 각 각의 특징은 아래와 같습니다.
- 명령형(Imperative):
1 .How - 어떻게 할 것인가?
2. 단계별로 상세히 설명
Ex) Add 함수에 배열이 파라미터로 주어질 때, 변수를 선언하고 해당 변수의 상태가 배열의 값에 의해서 변하도록 구현
- 선언형(Declarative):
1. What - 무엇을 할 것인가?
2. 해야할 것을 직관적이고 명시적으로 나타냄
3. 명령형으로 구현된 것들이 추상화가 되어있는 상태
Ex) Add 함수에 배열이 파라미터로 주어질 때, map 고차함수를 이용해 배열의 값을 더하는 방식으로 구현
3. Retry
쉬운 재시도가 가능해집니다.
통신을 하다보면 실패를 하기도 합니다. 만약 실패하게되면 재시도를 하도록 처리할 수 있습니다. 하지만 기존의 탈출 클로저 등을 이용해 completion을 작성하게되면 구현부가 굉장히 복잡해집니다. Rx를 사용하면 .retry 한줄만 추가하면 자동으로 재시도를 해줍니다.
Ex) .retry(3) 은 실패시에 3번까지 재시도하는 것을 의미합니다.
Rx를 사용해야하는 이유는 이 보다 더 많을 수 있습니다.
하지만 필수는 아닙니다.
프로젝트의 아키텍쳐, 상황 등을 판단해 선택하시면 됩니다.
'Develop > iOS' 카테고리의 다른 글
[RxSwift] 2. Subject and Relay (0) | 2021.11.02 |
---|---|
[RxSwift] 1. Observable (0) | 2021.10.29 |
[iOS]Tab Bar의 Layout (0) | 2021.08.03 |
[iOS]전화 바로 걸기: 전화 번호와 특수문자 (0) | 2021.08.02 |
[Swift] textField를 통해 PickerView를 사용시 문제점 개선한 방법 (0) | 2020.11.04 |
- Total
- Today
- Yesterday
- 프로파일
- Apple
- RxSwift
- certificate
- provisioning profile
- Push
- remote
- MVVM
- 클린아키텍처
- 동적계획법
- APNS
- MVC
- 프로비저닝
- dip
- rxcocoa
- Clean Architecture
- notification
- 아키텍처
- TextField
- Crossing Boundaries
- TabBar
- 코테
- Rx
- subject
- relay
- CSR
- 프로비저닝 프로파일
- ios
- 코드사이닝
- Swift
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |