[swift] Swift Moya와 RxSwift 함께 사용하기

소개

Swift Moya와 RxSwift는 모두 스위프트 언어를 기반으로 한 대표적인 라이브러리입니다. Moya는 네트워크 요청을 추상화한 라이브러리로, 네트워킹 코드를 간결하고 유지보수하기 쉽게 작성할 수 있게 도와줍니다. RxSwift는 리액티브 프로그래밍 패러다임을 지원하는 라이브러리로, 비동기 코드를 보다 간결하고 직관적으로 작성할 수 있게 해줍니다.

이번 글에서는 Swift Moya와 RxSwift를 함께 사용하는 방법에 대해 알아보겠습니다.

설치

먼저, Swift 프로젝트에 Moya와 RxSwift를 설치해야 합니다. 이를 위해 CocoaPods를 사용하겠습니다. 프로젝트 폴더에서 Podfile을 생성하고 다음과 같이 작성합니다:

platform :ios, '10.0'

target 'MyApp' do
  use_frameworks!

  pod 'Moya/RxSwift', '~> 14.0'
  pod 'RxSwift', '~> 6.0'

end

그리고 터미널에서 pod install 명령어를 실행하여 의존성을 설치합니다.

사용법

Moya Provider 설정

먼저, Moya를 사용하기 위해 MoyaProvider를 설정해야 합니다. MoyaProviderTargetType 프로토콜을 구현하는 타겟과 함께 사용됩니다.

import Moya

// 타겟 설정
enum MyAPIService {
    case getUser(id: Int)
    case createUser(name: String, email: String)
}

// 타겟 구현
extension MyAPIService: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }
    
    var path: String {
        switch self {
        case .getUser(let id):
            return "/users/\(id)"
        case .createUser:
            return "/users"
        }
    }
    
    var method: Method {
        switch self {
        case .getUser:
            return .get
        case .createUser:
            return .post
        }
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        switch self {
        case .getUser, .createUser:
            return .requestPlain
        }
    }
    
    var headers: [String: String]? {
        return nil
    }
}

네트워크 요청

MoyaProvider를 사용하여 네트워크 요청을 보낼 수 있습니다. 이때, 리액티브한 방식으로 사용하기 위해 Moya/RxSwift에 포함된 rx 메서드를 사용합니다.

import RxSwift
import Moya

let provider = MoyaProvider<MyAPIService>()
let disposeBag = DisposeBag()

provider.rx.request(.getUser(id: 1))
    .subscribe { event in
        switch event {
        case .success(let response):
            // 성공적으로 응답을 받은 경우
            let data = response.data
            // 응답 데이터 처리
        case .error(let error):
            // 요청 에러 처리
            print(error)
        }
    }
    .disposed(by: disposeBag)

RxSwift와 함께 사용하기

반환된 응답 데이터를 RxSwift의 옵저버블로 변환하여 편리하게 처리할 수 있습니다. 예를 들어, 받은 JSON 데이터를 파싱하여 UI 업데이트를 할 수 있습니다.

import RxSwift
import RxCocoa
import Moya

let provider = MoyaProvider<MyAPIService>()
let disposeBag = DisposeBag()

let user = BehaviorRelay<User?>(value: nil)

provider.rx.request(.getUser(id: 1))
    .map(User.self) // 응답 데이터를 User 객체로 맵핑
    .asObservable()
    .bind(to: user)
    .disposed(by: disposeBag)

user
    .subscribe(onNext: { user in
        // user 업데이트가 발생하면 UI를 갱신합니다.
    })
    .disposed(by: disposeBag)

결론

이렇게 Swift Moya와 RxSwift를 함께 사용하여 네트워크 요청을 보다 효과적이고 유지보수하기 쉬운 코드로 작성할 수 있습니다. Moya의 추상화된 인터페이스와 RxSwift의 리액티브 패러다임을 잘 활용하면 비동기 코드를 보다 간결하게 처리할 수 있습니다.

더 자세한 내용은 Swift Moya와 RxSwift의 공식 문서 및 예제를 참고하시기 바랍니다.

참고 자료