[swift] RxSwift를 이용한 네트워크 요청 처리 방법

RxSwift는 Swift에서 리액티브 프로그래밍을 할 수 있도록 도와주는 라이브러리입니다. 네트워크 요청을 처리할 때도 RxSwift를 통해 간편하고 유연하게 처리할 수 있습니다. 이번 블로그 포스트에서는 RxSwift를 이용해서 네트워크 요청을 어떻게 처리하는지에 대해 알아보겠습니다.

RxSwift와 RxCocoa 가져오기

먼저 프로젝트에 RxSwift와 RxCocoa를 가져와야 합니다. 이를 위해 CocoaPods를 사용하거나, 수동으로 프로젝트에 라이브러리를 추가할 수 있습니다.

import RxSwift
import RxCocoa

네트워크 요청 처리하기

RxSwift를 이용해서 네트워크 요청을 처리할 때는 Observable 객체를 사용합니다. Observable은 간단히 말해 데이터 스트림입니다. 네트워크 요청을 하면 서버로부터 데이터가 스트림 형태로 계속 전달되며, 이를 Observable로 받아서 처리할 수 있습니다.

먼저 URLSession을 이용해서 네트워크 요청을 보내고, 응답 데이터를 Observable로 받는 방법을 알아보겠습니다. 아래의 코드를 참고해주세요.

func request(url: URL) -> Observable<Data> {
    return Observable.create { observer in
        let task = URLSession.shared.dataTask(with: url) { data, _, error in
            if let error = error {
                observer.onError(error)
                return
            }
            
            if let data = data {
                observer.onNext(data)
                observer.onCompleted()
            }
        }
        
        task.resume()
        
        return Disposables.create {
            task.cancel()
        }
    }
}

위의 request(url:) 메소드는 URLSession을 이용해서 네트워크 요청을 보내고, 응답 데이터를 Observable로 변환해주는 메소드입니다. Observable.create를 사용하여 새로운 Observable을 생성하고, URLSessiondataTask을 이용해서 요청을 보내고, 응답 데이터가 있는 경우 observer.onNext(data)를 호출해 데이터를 전달하고, 에러가 있는 경우 observer.onError(error)를 호출해 에러를 전달합니다.

이제 request(url:) 메소드를 호출해서 네트워크 요청을 처리하는 코드를 작성해보겠습니다.

let url = URL(string: "https://api.example.com/data")!
request(url: url)
    .subscribe(onNext: { data in
        // 데이터를 받아서 처리하는 로직
    }, onError: { error in
        // 에러를 처리하는 로직
    })
    .disposed(by: disposeBag)

위의 코드에서는 request(url:) 메소드를 호출하고, 응답 데이터를 받아서 처리하는 코드를 subscribe(onNext: onError:)를 이용해서 작성했습니다. disposeBagObservable의 라이프사이클을 관리하기 위한 객체로, 메모리 누수를 방지하기 위해 사용됩니다.

RxSwift의 다양한 연산자 활용하기

RxSwift는 다양한 연산자를 제공해 데이터 스트림을 가공하고 변형할 수 있습니다. 네트워크 응답 데이터도 이러한 연산자를 사용해서 원하는 형태로 가공할 수 있습니다. 몇 가지 예시를 살펴보겠습니다.

map 연산자

map 연산자는 Observable이 방출하는 각각의 요소들을 변형할 때 사용됩니다. 예를 들어, JSON 형태의 데이터를 파싱해서 객체로 변환하거나, 데이터를 가공해서 다른 형태로 변환하는 등의 작업을 할 때 사용할 수 있습니다.

request(url: url)
    .map { data -> Model in
        // 데이터를 파싱해서 Model 객체로 변환하는 작업
    }
    .subscribe(onNext: { model in
        // 변환된 데이터를 사용하는 로직
    })
    .disposed(by: disposeBag)

filter 연산자

filter 연산자는 Observable이 방출하는 요소들 중에서 조건을 만족하는 요소들만 필터링할 때 사용됩니다. 예를 들어, 특정 조건을 만족하는 데이터만을 처리하는 경우에 사용할 수 있습니다.

request(url: url)
    .filter { data -> Bool in
        // 데이터의 조건을 검사하는 로직
    }
    .subscribe(onNext: { data in
        // 조건을 만족하는 데이터를 처리하는 로직
    })
    .disposed(by: disposeBag)

정리하기

이번 블로그 포스트에서는 RxSwift를 이용해서 네트워크 요청을 처리하는 방법을 알아보았습니다. Observable을 이용해서 네트워크 요청을 보내고 응답 데이터를 처리할 수 있으며, 다양한 연산자를 사용해서 데이터 스트림을 가공하고 변형할 수도 있습니다. RxSwift를 적절히 활용하면 네트워크 요청 처리를 훨씬 간편하고 유연하게 할 수 있습니다.