[swift] Swift Moya에서 리트라이 기능 구현하기

Moya는 Swift용 네트워킹 라이브러리로, Alamofire와 함께 사용되는 매우 강력한 도구입니다. 이 라이브러리를 사용하여 네트워크 호출을 수행할 때, 가끔 서버로부터 일시적인 오류(response code가 5xx 인 경우)가 발생할 수 있습니다. 이러한 경우에 리트라이 기능을 추가하여 요청을 다시 시도할 수 있습니다.

Moya 리트라이 기능 구현 방법

Moya에서 리트라이 기능을 구현하는 방법은 다음과 같습니다:

  1. MoyaProvider에서 endpointClosure 클로저를 사용하여 리트라이 로직을 추가합니다.
let endpointClosure = { (target: MyAPI) -> Endpoint in
    let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
    return defaultEndpoint.adding(newHTTPHeaderFields: ["Authorization": "Bearer \(token)"])
                        .retriesOnConnectionFailure() // 리트라이 기능 추가
}

let provider = MoyaProvider<MyAPI>(endpointClosure: endpointClosure)
  1. 리트라이 로직은 retriesOnConnectionFailure() 메서드를 사용하여 구현합니다.
request.retriesOnConnectionFailure() // request가 실패한 경우에 리트라이 시도
            .subscribe { _ in
                // 성공처리
            } onError: { error in
                // 실패 처리
            }
            .disposed(by: disposeBag)

리트라이 로직 사용 예제

다음은 Moya를 사용하여 네트워크 호출을 할 때 리트라이 기능을 구현하는 예제입니다:

enum MyAPI {
    case getUsers
}

extension MyAPI: TargetType {
    var baseURL: URL {
        return URL(string: "https://api.example.com")!
    }
    
    var path: String {
        switch self {
        case .getUsers:
            return "/users"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .getUsers:
            return .get
        }
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        return .requestPlain
    }
    
    var headers: [String : String]? {
        return nil
    }
}

let endpointClosure = { (target: MyAPI) -> Endpoint in
    let defaultEndpoint = MoyaProvider.defaultEndpointMapping(for: target)
    return defaultEndpoint.retriesOnConnectionFailure()
}

let provider = MoyaProvider<MyAPI>(endpointClosure: endpointClosure)

provider.request(.getUsers) { result in
    switch result {
    case let .success(response):
        // 성공 처리
    case let .failure(error):
        // 실패 처리
    }
}

위의 예제에서는 MoyaProvider를 생성할 때 endpointClosure를 사용하여 리트라이 기능을 구현합니다. 그리고 API 호출 시 retriesOnConnectionFailure() 메서드를 사용하여 리트라이가 필요한 경우에 시도하게 됩니다.

결론

Moya를 사용하여 네트워크 호출을 수행할 때, 서버로부터 일시적인 오류가 발생하는 경우 리트라이 기능을 추가하면 서버와의 연결이 끊어졌을 때 자동으로 시도할 수 있습니다. 이를 통해 안정적인 서비스를 제공할 수 있으며, 사용자 경험을 향상시킬 수 있습니다.

출처: Moya 공식 문서