iOS

[iOS] RxSwift 알아보기 (1)

yanni13 2024. 10. 13. 12:23

 

 

개발을 하다 보면 비동기 이벤트를 많이 다루게 된다. 버튼을 눌렀을 때나,

api 호출을 했을 때 응답을 받아올 때 이외에도 여러 가지 기능에서 비동기 프로그래밍이 필요하다. 

 

이 비동기 프로그래밍을 더 효과적으로 다룰 수 있는 RxSwift가 무엇인지에 대해 알아보자.

 

 

💡 RxSwift

 

RxSwift란 공식사이트에 들어가보면 비동기 작업과 데이터 스트림을 객체 형태로 쉽게 구성할 수 있도록 하고 Observable, 이러한 비동기 작업을 변환하고 구성하기 위한 메서드 모음을 제공한다고 설명하고 있다.

 

비동기 프로그래밍과 이벤트 기반 프로그래밍을 쉽게 할 수 있도록 도와주는 반응형 프레임워크이다!

 

RxSwift의 공식문서에서는 observable 스트림에서 다양한 이벤트를 방송하고 구독할 수 있다고 설명하고 있다.

observable은 데이터나 이벤트의 변화를 감지하고 그 변화를 observer(관찰자)가 보고 있다가(=구독하고 있다가) 값이 변하면 해당 값으로 변경처리를 해준다.

 

즉, RxSwift는 Observable을 사용해 데이터의 변화를 감지하고, 그 변화를 Observer에 전달함으로써 반응형 프로그래밍하게 되는 것이다!

 

따라서 버튼 클릭이나, API 응답에 대한 이벤트를 실시간으로 구독하여 변화를 감지하면 변경된 값으로 처리할 수 있게 되는 것이다.

 

 

📍RxSwift의 핵심 3요소

1. Observable

RxSwift는 Observable을 사용해 데이터의 변화를 감지한다고 위에 설명했는데 Observable이 바로 관찰가능한 객체!!라는 것이다.

계속 관찰하고 있다가 어떤 데이터가 변할 때 변화가 발생할 때마다 Observer에게 그 변화를 알려주게 된다.

 

let text = Observable.just("Hello")

 

 

2. Observer

Observer는 Observable을 구독하여 처리하는 역할을 한다.

 

1번과 2번을 정리해서 보면 Observable은 변화를 감지해서 -> Observer에게 알려주고 Observer는 그 변경된 데이터로 처리하는 역할을 하게 되는 것이다.

 

text.subscribe(onNext: { value in
    print(value)  // 변경된 값을 출력
}, onError: { error in
    print("Error: \(error)")
}, onCompleted: {
    print("Completed")
})

 

여기서 Observable을 통해 text라는 값이 변경됐다는걸 받아서 값을 출력해 주고, 에러핸들링을 해줄 수 있게 된다!

 

subsribe에는 클로저로 OnError, onCompleted 외에도 OnNext, OnDisposed를 통해 데이터를 처리할 수 있도록 되어 있다.

 

 

3. Operators

OperatorsObservable에서 감지한(=방출된) 데이터를 변환하거나 필터링, 결합하는데 사용된다.

받은 데이터를 Map이나 filter를 사용해 정렬할 수도 있고, 이것도 마찬가지로 감지된 데이터를 어떻게 처리할 거냐!! 에 대한 것이다.

 

보통 아래 코드처럼 사용한다고 한다!

(코드로 구현해보면서 어떤 메서드가 있는지 찾아봐야 할 거 같다!)

text
    .map { value in
        return value.uppercased()  // 데이터를 대문자로 변환
    }
    .subscribe(onNext: { value in
        print(value)  // 대문자로 변환된 값을 출력
    })

 

 

 

✔️ 필요성

RxSwift가 존재한다고 해도 우리는 이미 SwiftUI나 UIKit을 사용해서 비동기 이벤트를 잘 처리해 왔는데

왜 RxSwift를 사용하는 게 비동기에 좋을까?라고 이해하지 못할 수도 있다.(나도 그랬다)

 

또한 구독을 해서 변경된 값을 감지하는 건 RxSwift만 가능한 게 아니라 Notification이나 Closure를 통해 잘 사용해 왔었다.

그럼 어떤 장점 때문에 RxSwift가 반응형 프로그래밍에서 더 효율적인지 알아보자!

 

1️⃣  선언적인 방식으로 앱을 구축할 수 있다.

 

Notification이나 closure를 통해 작성하게 된다면, 각 이벤트들마다 따로 처리를 해줘야 되기 때문에 여러 이벤트들이 발생했을 때 코드가 길어지게 되어 가독성이 떨어질 수 있다.

반면 RxSwift는 Observable 통해 데이터를 처리하는 과정을 선언적으로 작성할 수 있게 되면서 복잡한 비동기 흐름들을 하나의 데이터 스트림으로 통합할 수 있어 코드가 간결해지고 추후 유지보수도 쉬워지게 된다.

 

 

2️⃣  명령형 프로그래밍의 한계를 극복할 수 있다.

명령형 프로그래밍은 비동기 작업을 다룰 때 이 작업들이 언제 끝날지 예상하지 못한다. 따라서 실행 순서에 따른 관리가 잘 지켜져야 하고, 잘못하면 실행 순서가 꼬이게 되면 결과도 다르게 나온다는 것이다.

 

반면 이런 비동기 작업들을 RxSwift는 Observable를 통해 비동기적으로 데이터를 처리하고 그 결과를 차례대로 처리하여 이벤트가 발생하는 순서를 정확하게 제어할 수 있게 되는 것이다.

 

 

 

 

 

 

2탄은 예제로 알아보도록 하겠다!

아직 너무 어렵다 ㅎㅎㅎ..,,,

 


참고

https://github.com/ReactiveX/RxSwift

https://babbab2.tistory.com/182

https://babbab2.tistory.com/185?category=1053063

https://ios-development.tistory.com/95