[swift] Reachability를 사용한 네트워크 에러 핸들링 방법

네트워크 연결 상태를 확인하고 네트워크 에러를 처리하는 것은 모바일 앱 개발에서 중요한 부분입니다. Swift에서 Reachability 라이브러리를 사용하여 네트워크 상태를 모니터링하고 에러를 처리하는 방법을 알아보겠습니다.

Reachability 라이브러리 설치

Reachability를 사용하기 위해선 먼저 해당 라이브러리를 프로젝트에 추가해야 합니다. CocoaPods를 사용한다면 Podfile에 다음과 같이 추가합니다.

pod 'ReachabilitySwift'

이후 pod install 명령어를 통해 라이브러리를 설치하고, .xcworkspace 파일을 열어줍니다.

Reachability 클래스 생성

Reachability 클래스를 생성하여 네트워크 상태를 확인하고 필요한 동작을 수행합니다. 다음과 같이 Reachability 클래스를 생성합니다.

import ReachabilitySwift

class NetworkManager {
    static let shared = NetworkManager()
    let reachability = Reachability()!

    private init() {
        NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChanged), name: ReachabilityChangedNotification, object: nil)
        try! reachability.startNotifier()
    }

    deinit {
        reachability.stopNotifier()
        NotificationCenter.default.removeObserver(self)
    }

    @objc private func networkStatusChanged() {
        switch reachability.currentReachabilityStatus {
        case .notReachable:
            // 네트워크 연결 없음 처리
            print("네트워크 연결이 없습니다.")
        case .reachableViaWiFi:
            // 와이파이 연결 처리
            print("와이파이로 연결되었습니다.")
        case .reachableViaWWAN:
            // 모바일 데이터 연결 처리
            print("모바일 데이터로 연결되었습니다.")
        }
    }
}

위 코드에서는 Singleton 패턴을 이용하여 NetworkManager 클래스를 구현하였습니다. Reachability 객체를 생성하고 NotificationCenter를 이용하여 네트워크 상태 변화를 감지합니다. networkStatusChanged 메소드를 통해 현재의 네트워크 상태에 맞게 처리를 할 수 있습니다.

네트워크 에러 핸들링

네트워크 에러가 발생했을 때에는 해당 에러를 처리하는 로직을 구현해야 합니다. 예를 들어, 네트워크 요청이 실패했을 때 에러 메시지를 보여주거나 재시도 등의 동작을 수행할 수 있습니다. 다음은 네트워크 에러 핸들링의 예시입니다.

import UIKit

class ViewController: UIViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    
    // 예시로 에러 발생시켜보기
    fetchDataFromNetwork()
  }
  
  private func fetchDataFromNetwork() {
    // 네트워크 요청
    // ...
    
    // 에러 일으키기
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
      NetworkManager.shared.reachability.currentReachabilityStatus = .notReachable
    }
  }
  
  private func showErrorAlert() {
    let alertController = UIAlertController(title: "에러", message: "네트워크 연결이 없습니다.", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
    alertController.addAction(okAction)
    present(alertController, animated: true, completion: nil)
  }
  
  @IBAction func retryButtonTapped(_ sender: UIButton) {
    // 재시도 버튼을 눌렀을 때의 동작
  }
}

위의 예제는 ViewController에서 fetchDataFromNetwork 메소드를 통해 서버로부터 데이터를 가져오고, 2초 뒤에 네트워크 상태를 .notReachable로 변경하는 예시입니다. 이때 showErrorAlert 메소드를 호출하여 사용자에게 알림을 보여줍니다.

위 예제는 단순한 예시일 뿐이며, 실제 앱에서는 경우에 따라 다양한 에러 핸들링 방법이 필요할 수 있습니다.

결론

이렇게 Reachability를 사용하여 네트워크 상태를 모니터링하고 에러를 처리하는 방법을 알아보았습니다. 실제 앱에서는 네트워크 에러 핸들링을 위해 다양한 방법을 적용할 수 있으니, 상황에 맞게 최적의 방법을 선택하여 사용하시기 바랍니다.

참고 자료