[swift] 아폴로 에러 핸들링 방법

아폴로(Apollo)는 Swift를 위한 우수한 GraphQL 클라이언트 라이브러리입니다. 그러나 API 요청 중에 발생하는 에러를 처리하는 방법을 알고 있는 것이 중요합니다. 이번 블로그에서는 아폴로 에러 핸들링 방법을 알려드리겠습니다.

1. 에러 핸들링 개념

아폴로로 API 요청을 보낼 때, 두 가지 종류의 에러가 발생할 수 있습니다. 첫째, 네트워크 에러는 서버와의 통신 중에 발생하는 것이며, 둘째, GraphQL 에러는 서버에 의해 반환되는 에러입니다. 우리는 이러한 에러들에 대응하는 방법을 알아볼 것입니다.

2. 네트워크 에러 핸들링

아폴로에서 네트워크 에러를 핸들링하기 위해 ApolloError라는 타입을 제공합니다. 아래는 간단한 예제입니다.

apollo.fetch(query: MyQuery()) { result in
  switch result {
  case .success(let graphQLResult):
    // API 요청이 성공했을 때 처리할 코드 작성
  case .failure(let error):
    if let apolloError = error as? ApolloError {
      switch apolloError {
      case .requestError(let apolloError):
        // 네트워크 에러에 대한 처리 코드 작성
      default:
        // 그 외의 에러에 대한 처리 코드 작성
      }
    }
  }
}

위의 코드에서 fetch 메서드를 통해 API 요청을 보내고, 결과를 result 변수로 받습니다. 성공적으로 응답이 도착했을 경우 .success 케이스가 호출되며, 네트워크 에러가 발생했을 경우 .failure 케이스가 호출됩니다. 이때, ApolloError 타입을 통해 에러를 처리할 수 있습니다.

3. GraphQL 에러 핸들링

GraphQL 에러는 API 요청이 성공적으로 수행되었지만, 서버가 반환한 오류에 대한 것입니다. 이러한 에러는 graphQLResult 객체의 errors 속성을 통해 확인할 수 있습니다. 아래는 간단한 예제입니다.

apollo.fetch(query: MyQuery()) { result in
  switch result {
  case .success(let graphQLResult):
    if let errors = graphQLResult.errors {
      // GraphQL 에러에 대한 처리 코드 작성
    } else {
      // API 요청이 성공했을 때 처리할 코드 작성
    }
  case .failure(let error):
    // 네트워크 에러에 대한 처리 코드 작성
  }
}

위의 코드에서 fetch 메서드로 보낸 API 요청은 성공적으로 수행되었지만, graphQLResult 객체의 errors 속성에 값이 있다면 GraphQL 에러가 발생한 것입니다. 이때 에러에 대한 처리를 위해 errors 값을 사용할 수 있습니다.

4. 커스텀 에러 핸들링

아폴로는 커스텀 에러 핸들링에 대한 유연성을 제공합니다. ApolloError 타입을 확장하여 사용자 정의 에러를 처리하는 것이 가능합니다. 아래는 예제입니다.

class MyError: ApolloError {
  // 사용자 정의 에러 추가
}

apollo.fetch(query: MyQuery()) { result in
  switch result {
  case .success(let graphQLResult):
    // API 요청이 성공했을 때 처리할 코드 작성
  case .failure(let error):
    if let myError = error as? MyError {
      // 사용자 정의 에러에 대한 처리 코드 작성
    } else {
      // 그 외의 에러에 대한 처리 코드 작성
    }
  }
}

위의 예제에서는 ApolloError를 상속받아 MyError 타입을 만들어서 사용자 정의 에러를 처리하고 있습니다. 이러한 커스텀 에러를 사용하여 보다 유연하게 에러 핸들링을 할 수 있습니다.

5. 결론

아폴로 에러 핸들링은 Swift에서 GraphQL API를 사용하는 중요한 과제입니다. 이번 블로그에서는 아폴로의 네트워크 에러와 GraphQL 에러를 처리하는 방법을 알아보았습니다. 앞으로 실제 프로젝트에서 아폴로를 사용하는 경우, 이러한 에러 핸들링 기능을 적절히 활용하여 안정적인 애플리케이션을 개발하는 것을 권장드립니다.

참고 자료