티스토리 뷰
RxSwift 많이 들어보기만 들어봤지,,, 어려울 것 같아 공부하지 않았던 친구를 알아보려고 한다.
📖 목차
1. RxSwift가 무엇인가?
2. Observable, Observer
3. Subject
1. RxSwift가 무엇인가?
RxSwift는 반응형(Reactive) + 비동기 처리 라고 생각하면 된다.
RxSwift는 반응형 프로그래밍을 기반으로 하고 있으며 데이터의 흐름과 변화를 "관찰"하고, 이 변화를 즉각적으로 처리하는 방식이다.
GitHub - ReactiveX/RxSwift: Reactive Programming in Swift
Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.
github.com
그러면 왜 swift에서 제공해 주는 비동기 처리 방법들도 많은데 RxSwift를 사용하는 걸까?
Swift에서 제공하는 GCD, DispatchQueue, async/await 같은 비동기 처리 방법은 단순히 비동기 작업에 중점을 둔다. 반면에 RxSwift는 데이터의 흐름 자체를 반응형으로 처리할 수 있어, 비동기 작업뿐만 아니라 데이터 흐름의 변화를 좀 더 유연하게 관리할 수 있다고 한다.
이렇게 개념으로 봤을때 뭐가 RxSwift를 왜 사용해야 하는지 감이 잘 안 잡혔다.
데이터 흐름 자체를 반응형으로 처리할 수 있다는데, 다른 비동기 처리 방법은 안 되는 건가..? 라는 의문도 들었다.
요리하는 과정에 비유해서 차이점을 이해해 보자.
1. DispatchQueue: 수동으로 요리하기
DispatchQueue는 요리사가 요리를 직접 수동으로 관리하는 것과 같다. 요리사는 각 단계에서 재료를 준비하고, 조리하고, 마지막에 결과를 내야 한다.
- 재료 준비: 요리사가 직접 재료를 손질하고, 요리를 시작하기 전에 모든 준비를 마쳐야 함.
- 조리: 요리사가 불을 켜고, 재료를 볶고, 끓이는 과정을 하나하나 지켜봐야 하고, 각 단계가 끝날 때마다 다음 단계를 수동으로 시작해야 함.
- 결과 확인: 요리가 끝난 후, 결과를 확인하고 손님에게 서빙해야 함. 만약 중간에 문제가 생기면 다시 돌아가서 수동으로 수정해야 함.
수동으로 관리하고 또 문제 생기면 수동으로 수정해야 하기 때문에 이 과정은 단순한 요리라면 괜찮지만, 여러 요리를 동시에 하거나 복잡한 레시피일 경우 매우 복잡해질 수 있다!!
2. RxSwift: 자동으로 요리하기
반면, RxSwift는 셰프가 요리하는 것처럼 생각할 수 있다. 셰프는 주방의 모든 재료와 조리 과정을 자동으로 관리한다.
- 재료 흐름: 셰프는 재료가 준비되는 과정을 관찰하고, 필요한 재료가 준비되면 다음 단계로 자동으로 넘어감.
- 조리 과정: 조리 상태를 실시간으로 확인하면서, 중간중간 손님에게 요리 진행 상황을 알릴 수 있음.
- 결과 반응: 요리가 완료되면 결과를 자동으로 서빙하고, 만약 손님이 뭘 요구하면 즉시 반응할 수 있음.
이 과정은 복잡한 요리를 할 때 매우 유용하다. 여러 요리를 동시에 하더라도 각 요리가 어떻게 진행되고 있는지를 쉽게 파악하고, 문제가 발생하면 즉시 반응할 수 있기 때문이다!!
정리해 보면,
DispatchQueue는 수동으로 각 단계를 관리하는 요리사처럼, 모든 과정을 직접 챙겨야 하고, RxSwift는 자동으로 데이터 흐름을 관리하는 셰프처럼, 여러 과정이 자연스럽게 연결되고, 상태 변화를 쉽게 추적할 수 있다.
여기서 중요한 점이 RxSwift는 자동으로 데이터 흐름을 관리하는 것이다!!
데이터와 상태 변화에 즉시 반응을 하기 때문에 반응형이고, 모든 비동기 과정을 확인하면서 일관성 있게 관리할 수 있다.
그래서 데이터와 상태의 변화에 즉시 반응하는 방식이 필요할 때나, 비동기 과정을 일관성 있게 관리해야 하는 경우라면 RxSwift를 사용하는 게 좋을 것 같다!
2. Observable, Observer
위에서 RxSwift의 개념과 왜 사용하는지 배워보았다.
이제 RxSwift에서 좀 중요한 개념들을 배워보자!!
RxSwift는 반응형 프로그래밍이기 때문에 어떤 비동기 이벤트에 대해 관찰 가능한 형태로 만들고,
이 변화를 관찰하는 관찰자가 있을 경우, 이 비동기 이벤트의 변화에 따른 전파를 받을 수 있다.
결론만 말하면, 다음과 같다.
Observable = 관찰 가능한 형태
Observer = 관찰자
이해하기 힘드니,,, 위의 요리 예시를 다시 확인해 보자.
요리 예시에서 Observable과 Observer가 무엇인지 생각해 보자.
1️⃣ Observable(재료)
Observable은 재료라고 생각할 수 있다. 셰프가 계속해서 재료를 관찰하고 관리하는 것처럼, Observable은 데이터의 흐름을 나타내며, 시간이 지남에 따라 데이터를 방출하거나 변화시키기 때문이다.
2️⃣ Observer(셰프)
Observer는 셰프라고 생각할 수 있다. 셰프가 주방에서 요리 상태를 실시간으로 확인하고, 재료가 준비되면 그걸 바로 사용해 요리를 하면서 손님에게 요리가 어디까지 진행됐는지 알려준다. 요리가 완료되면 손님에게 즉시 서빙할 수 있고, 추가 요청이 오면 그에 맞게 반응할 수 있다.
그럼 어느 정도 Observable과 Observer이 어떤 의미인지 짐작이 갈 것이다.
다른 예시를 하나 더 생각해 보자.
비동기 이벤트 중 하나인 버튼 클릭 이벤트를 예로 들어보자.
버튼을 클릭하는 이벤트는 비동기일까????? => 비동기가 맞다!
버튼 클릭 이벤트가 비동기인 이유는 클릭 이벤트가 언제 발생할지 모르기 때문이다.
만약에 동기였다면, 버튼이 눌릴 때까지 아무 작업도 할 수 없을 것이다.
1️⃣ Observable(버튼의 클릭 이벤트)
Observable을 셰프가 주방에서 재료의 흐름을 관리하는 것처럼 생각할 수 있다. 셰프는 언제 손님이 들어와서 어떤 재료를 사용할지 미리 알 수 없지만, 재료가 준비되면 바로 요리를 시작할 준비를 하고 있다.
버튼의 클릭 이벤트도 마찬가지로, 언제 유저가 버튼을 클릭할지 알 수 없지만, 버튼을 Observable로 설정해 두면 클릭 이벤트가 발생했을 때 그 정보를 Observer에게 자동으로 전달해 줄 수 있다.
=> 버튼 클릭 이벤트는 Observable이 되어서 마치 주방에 새로운 재료가 도착하는 것처럼 데이터의 변화를 방출한다.
2️⃣ Observer(버튼 클릭에 반응하는 처리 코드)
Observer는 셰프처럼 버튼의 상태를 관찰하는 역할을 한다. 셰프가 주방에서 재료가 준비되면 바로 요리에 들어가는 것처럼, Observer는 버튼이 눌렸을 때 즉각 반응한다.
=> 버튼이 클릭되면 Observer가 변화를 감지해서 반응할 수 있다.
휴~ 이제 진짜 Observable과 Observer를 좀 이해할 수 있게 되었다.
3. Subscribe
Observable과 Observer까지 알아봤는데 "그럼 이 둘 사이를 어떻게 연결할 수 있는거지??" 라는 생각을 할 수 있다.
Observer가 Observable을 구독할 수 있도록 해주는 것이 바로 Subscribe이다!!!!
Subscribe 메서드는 파라미터 총 4개로 다음과 같다.
public func subscribe(
onNext: ((Element) -> Void)? = nil,
onError: ((Swift.Error) -> Void)? = nil,
onCompleted: (() -> Void)? = nil,
onDisposed: (() -> Void)? = nil
) -> Disposable
위의 4가지 중 3가지 클로저를 파라미터로 넘겨줘서 이벤트를 처리할 수 있다.
3가지는 onNext, onError, onCompleted이다.
각각 어떤 역할을 하는지 알아보자!!
1️⃣ onNext
- Observable이 새로운 데이터를 방출할 때마다 호출되는 클로저다.
- 예를 들어, 버튼 클릭 이벤트에 대해 구독할 경우, 버튼이 클릭될 때마다 해당 클릭 이벤트에 대한 처리를 여기서 할 수 있다.
2️⃣ onError
- Observable에서 에러가 발생했을 때 호출되는 클로저다.
- 예를들어, 네트워크 요청을 처리하는 Observable에서 에러가 발생했을 때, 사용자에게 에러 메시지를 보여주는 코드를 작성할 수 있다.
3️⃣ onCompleted
- Observable이 더 이상 데이터를 방출하지 않을 때 호출되는 클로저다. 즉, 데이터 스트림이 정상적으로 완료되었음을 나타낸다.
- 예를들어, 네트워크 요청이 완료되고 더 이상 데이터가 방출되지 않는다면 onCompleted가 호출된다.
4️⃣ onDisposed
- 구독이 해제될 때 호출되는 클로저다.
- 예를들어, 네트워크 요청이 취소되거나 메모리 해제를 수행하는 작업을 넣을 수 있다.
파라미터의 역할에 대해서 간단하게 알아보았는데, onDisposed를 제외하고 3개의 파라미터는 이벤트를 처리하기 위한 역할을 하는 것을 알 수 있었다.
구독 해제에 대해서는 아직 안 배웠으니 여기까지 간단하게 알아두자!
✏️ 배운 것을 정리해 보자!!
- Observable: 데이터의 흐름을 생성하고 발행하는 주체.
- Observer: Observable의 데이터를 구독하고, 발행된 이벤트에 반응하는 주체.
- Subscribe: Observer가 Observable에 연결되어 데이터를 수신하도록 하는 행위.
이렇게 Rxswift의 주요한 개념들에 대해 알아봤는데 아직 갈길이 멀다,,,,
왜 이렇게 뭐가 많은지~~~
다음에는 예제와 함께 RxSwift의 동작 과정에 대해 알아보고자 한다 ㅎ
참고
https://babbab2.tistory.com/185
'iOS' 카테고리의 다른 글
[Swift] - fastlane + GitHub Actions CI 구축(1) (0) | 2024.11.12 |
---|---|
[Swift] - Rxswift 예제로 이해해보기 (0) | 2024.11.02 |
[Swift] - UnitTest 예제(Given-When-Then 패턴) (0) | 2024.10.01 |
[Swift] - SwiftUI와 UIKit의 AutoLayout 차이 (0) | 2024.09.08 |
[Swift] - TestFlight로 배포해보기 (0) | 2024.08.23 |