[swift] 에러 처리를 위한 프레임워크 사용 방법

에러 처리는 소프트웨어 개발에서 중요한 부분 중 하나입니다. 에러 처리를 효과적으로 수행하는 것은 어플리케이션의 안정성을 높이고 사용자 경험을 향상시킬 수 있습니다. Swift에서는 Error 프로토콜을 통해 에러를 정의하고, do-catch 문을 사용하여 에러를 처리합니다. 이러한 에러 처리 방식 외에도 다양한 프레임워크를 사용하여 에러를 처리할 수 있습니다.

1. Error 프로토콜을 준수하는 에러 정의

에러를 처리하기 위해서는 먼저 해당 에러를 정의해야 합니다. 이를 위해 Error 프로토콜을 준수하는 열거형을 선언합니다. 다음은 간단한 네트워크 에러를 나타내는 예시 코드입니다.

enum NetworkError: Error {
    case invalidURL
    case noInternetConnection
    case serverError
}

위 코드에서 NetworkErrorError 프로토콜을 준수하며, 각각의 케이스는 다양한 네트워크 에러를 나타냅니다.

2. Result 타입을 이용한 에러 처리

Swift 5부터는 에러를 처리하기 위한 Result 타입이 추가되었습니다. Result는 성공 또는 실패 시의 값을 저장할 수 있는 제네릭 타입으로, 에러를 처리하는 데 유용합니다.

다음은 Result 타입을 사용하여 네트워크 요청을 수행하고 에러를 처리하는 예시 코드입니다.

func fetchUserData(completion: (Result<User, NetworkError>) -> Void) {
    // 네트워크 요청 수행
    //...
    if success {
        completion(.success(user))
    } else {
        completion(.failure(.serverError))
    }
}

// 사용 예시
fetchUserData { result in
    switch result {
    case .success(let user):
        // 성공적으로 유저 데이터를 받아온 경우 처리
    case .failure(let error):
        // 에러 발생시 처리
    }
}

3. Apple의 Combine 프레임워크를 이용한 에러 처리

Apple의 Combine 프레임워크는 비동기 작업을 위한 함수형 반응형 프로그래밍을 지원합니다. 이를 통해 에러를 처리하고 데이터를 합성하는 것이 가능합니다.

fetchUserData()
    .sink(receiveCompletion: { completion in
        switch completion {
        case .finished:
            // 성공적으로 완료된 경우 처리
        case .failure(let error):
            // 에러 발생시 처리
        }
    }, receiveValue: { user in
        // 받아온 데이터 처리
    })
    .store(in: &cancellables)

위 코드에서 fetchUserData 함수는 데이터를 방출하거나 실패할 수 있는 Publisher를 반환합니다. sink 연산자는 성공 또는 실패의 이벤트를 처리합니다.

에러 처리를 위해 다양한 방법과 프레임워크가 제공되고 있으며, 각 상황에 맞게 적절한 방법을 선택하여 안정적이고 견고한 어플리케이션을 개발할 수 있습니다.

참고 자료