[ios] Combine 프레임워크와 Error Handling

Combine 프레임워크는 Swift 언어와 iOS 앱 개발을 위한 리액티브 프로그래밍을 지원하는 강력한 도구입니다. Combine은 비동기적인 작업을 다룰 때 유용하며, 에러 처리 또한 중요한 부분입니다. 이번 포스트에서는 Combine 프레임워크에서의 에러 처리에 대해 살펴보겠습니다.

Combine에서의 에러 처리

Combine을 사용할 때 발생할 수 있는 에러는 두 가지 종류로 나뉩니다.

  1. Publisher가 에러를 내보내어 스트림이 종료되는 경우
  2. Operator가 에러를 내보내는 경우

Publisher에서의 에러 처리

Publisher는 데이터 스트림을 생성하고 에러를 내보낼 수 있습니다. 에러가 발생하면 해당 이벤트를 처리해야 합니다.

예를 들어, 네트워크 요청을 하는 경우 다음과 같이 에러를 처리할 수 있습니다.

import Combine

enum NetworkError: Error {
    case invalidResponse
    case requestFailed
}

func fetchData(url: URL) -> AnyPublisher<Data, Error> {
    return URLSession.shared.dataTaskPublisher(for: url)
        .tryMap { data, response in
            guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                throw NetworkError.invalidResponse
            }
            return data
        }
        .mapError { error in
            NetworkError.requestFailed
        }
        .eraseToAnyPublisher()
}

위 코드에서 tryMap을 사용하여 유효한 응답이 없는 경우 invalidResponse에러를 throw하고, mapError를 사용하여 네트워크 요청에 실패한 경우 requestFailed에러로 변경합니다.

Operator에서의 에러 처리

Operator는 데이터 스트림을 변환하거나 조작할 때 사용됩니다. Operator에서 발생하는 에러는 map, flatMap, filter 등의 메서드를 이용하여 처리할 수 있습니다.

예를 들어, 서버에서 받아온 데이터를 파싱하는 경우 다음과 같이 에러를 처리할 수 있습니다.

import Combine

enum ParsingError: Error {
    case invalidData
}

let responsePublisher = fetchData(url: someURL)
    .flatMap { data in
        Just(data)
            .tryMap { data in
                try parseData(data)
            }
            .mapError { _ in
                ParsingError.invalidData
            }
    }

위 코드에서는 flatMap을 사용하여 데이터를 받아와 파싱하고, tryMap을 통해 데이터 파싱 시도를 합니다. 그리고 mapError를 통해 발생할 수 있는 파싱 에러를 invalidData로 변경합니다.

이처럼 Combine 프레임워크에서는 Publisher와 Operator에서 발생하는 에러를 효과적으로 처리할 수 있습니다.

에러를 다루는 것은 앱의 안정성을 높이는데 중요한 부분이므로, Combine 프레임워크에서의 에러 처리에 익숙해지는 것이 좋습니다.

참고문헌:

이상으로 Combine 프레임워크에서의 에러 처리에 대해 알아보았습니다.