[swift] 비동기 작업의 재시도(retry) 처리 방법

비동기 작업을 수행하는 동안 네트워크 연결 문제, 서버 문제 또는 기타 예기치 못한 상황으로 실패할 수 있습니다. 이러한 상황에서 재시도 메커니즘을 구현하여 안정적인 앱을 제공하는 것이 중요합니다. Swift에서는 비동기 작업을 처리하는 여러 방법이 제공되며, 이 문서에서는 재시도 처리 방법을 살펴보겠습니다.

1. 재시도 로직 구현

비동기 작업을 수행하는 함수에 대해서 재시도 로직을 구현하는 것은 상당히 간단합니다. 예를 들어, 네트워크 요청을 보내는 함수에서 재시도를 처리하고 싶은 경우 아래와 같이 구현할 수 있습니다.

func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
    let maxRetries = 3
    var currentRetry = 0

    func fetchDataWithRetry() {
        // 비동기 작업 수행
        YourNetworkingLibrary.sendRequest { result in
            if case .success = result {
                completion(result)
            } else if currentRetry < maxRetries {
                currentRetry += 1
                fetchDataWithRetry() // 재시도
            } else {
                completion(result)
            }
        }
    }

    fetchDataWithRetry()
}

위의 예시 코드에서는 fetchData 함수를 호출할 때마다 최대 3번의 재시도가 이루어지며, YourNetworkingLibrary.sendRequest로 네트워크 요청을 보내고 성공 또는 실패에 따라 재시도 여부를 결정하고 있습니다.

2. 재시도 대기 시간 추가

실패한 경우 바로 다시 시도하는 것이 아니라 재시도 간격을 두고 시도하고 싶은 경우 아래와 같이 구현할 수 있습니다.

func fetchDataWithExponentialBackoff(completion: @escaping (Result<Data, Error>) -> Void) {
    let maxRetries = 3
    var currentRetry = 0

    func fetchDataWithRetry(after delay: TimeInterval) {
        DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
            // 네트워크 요청을 보내고 성공 또는 실패에 따라 재시도 여부 결정
            YourNetworkingLibrary.sendRequest { result in
                if case .success = result {
                    completion(result)
                } else if currentRetry < maxRetries {
                    currentRetry += 1
                    // 재시도 간격을 점차 증가시킴
                    let nextDelay = pow(2.0, Double(currentRetry))
                    fetchDataWithRetry(after: nextDelay) // 재시도
                } else {
                    completion(result)
                }
            }
        }
    }

    fetchDataWithRetry(after: 0)
}

3. 정리

재시도 로직을 구현하는 것은 예기치 못한 상황에 유연하게 대응하기 위해 중요합니다. 위에서 살펴본 예시들은 재시도 메커니즘을 구현하는 간단한 방법을 보여줍니다. 애플리케이션의 특정한 요구 사항에 맞게 재시도 로직을 구현하여 안정적인 앱을 개발하는 데 도움이 될 것입니다.

참고 자료: Swift Documentation