[swift] Swift PromiseKit과 재시도 로직

앱을 개발하다 보면 네트워크 요청이 실패할 수 있는 상황에 직면하기도 합니다. 이때 PromiseKit이라는 Swift 패키지와 재시도 로직을 사용하여 에러 처리를 할 수 있습니다.

PromiseKit이란?

PromiseKit은 비동기 처리를 위한 Swift 패키지로, 일련의 작업이 완료되거나 실패할 때까지 기다린 뒤 결과를 반환하는데 유용합니다. 이 패키지는 일반적으로 네트워크 요청과 같은 비동기 작업에서 많이 사용됩니다.

재시도 로직

일반적으로 네트워크 요청은 예기치 않게 실패할 수 있습니다. 이런 경우에 우리는 재시도 로직을 사용하여 요청을 다시 보내는 것이 좋습니다. 예를 들어, 네트워크 요청이 실패한 경우 일정 시간을 두고 재시도를 하는 방식입니다.

PromiseKit과 재시도 로직의 활용

PromiseKit과 재시도 로직을 함께 사용하여 네트워크 요청이 실패할 경우 재시도를 할 수 있습니다. 다음은 이를 구현한 예시 코드입니다.

func requestWithRetry(url: URL, retries: Int) -> Promise<Data> {
    return firstly {
        URLSession.shared.dataTask(.promise, with: url)
            .map(\.data)
    }.recover { error -> Promise<Data> in
        guard retries > 0 else {
            return Promise(error: error)
        }
        return after(seconds: 1).then { _ -> Promise<Data> in
            requestWithRetry(url: url, retries: retries - 1)
        }
    }
}

위 코드에서는 requestWithRetry라는 함수를 정의하였습니다. 이 함수는 주어진 URL에 대해 재시도를 지원하는 네트워크 요청을 하게 됩니다.

URLSession.shared.dataTask(.promise, with: url)을 통해 네트워크 요청을 합니다. 그리고 map(\.data)를 사용하여 응답 데이터를 반환합니다. 만약 요청이 실패할 경우 recover 함수를 사용하여 재시도를 수행합니다.

recover 함수는 에러가 발생하면 실행되는 클로저입니다. 재시도 횟수가 0보다 큰 경우 after(seconds: 1).then을 사용하여 1초를 기다린 후에 requestWithRetry 함수를 다시 호출합니다. 이렇게 재시도를 하는 과정을 재귀적으로 반복하며 재시도 횟수가 0이 되면 최종적으로 실패한 결과를 반환합니다.

위 예시 코드는 네트워크 요청을 위한 함수를 구현한 것이지만, 이러한 방식은 다양한 비동기 작업에 적용할 수 있습니다.

결론

Swift PromiseKit과 재시도 로직을 함께 사용하여 네트워크 요청이 실패할 경우 재시도를 할 수 있습니다. 이를 통해 앱의 안정성과 신뢰성을 높일 수 있습니다. PromiseKit을 사용하면 비동기 작업을 보다 효율적으로 처리할 수 있으며, 재시도 로직을 추가하여 에러 처리를 강화할 수 있습니다.


참고 자료: