[swift] Swift Moya에서 리트라이 기능 구현하기
Moya는 Swift용 네트워킹 라이브러리로, Alamofire와 함께 사용되는 매우 강력한 도구입니다. 이 라이브러리를 사용하여 네트워크 호출을 수행할 때, 가끔 서버로부터 일시적인 오류(response code가 5xx 인 경우)가 발생할 수 있습니다. 이러한 경우에 리트라이 기능을 추가하여 요청을 다시 시도할 수 있습니다.
Moya 리트라이 기능 구현 방법
Moya에서 리트라이 기능을 구현하는 방법은 다음과 같습니다:
- 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)
- 리트라이 로직은
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 공식 문서