[swift] - Swift에서 AlamofireNetworkActivityIndicator와 함께 사용되는 네트워크 로그 기록하기

앱 개발 중 네트워크 통신 시 로그를 기록하는 것은 매우 중요합니다. 이를 통해 통신 동작을 추적하고 문제 발생 시 원인을 파악할 수 있습니다. 이번 글에서는 AlamofireNetworkActivityIndicator와 함께 Swift에서 네트워크 로그를 기록하는 방법에 대해 알아보겠습니다.

AlamofireNetworkActivityIndicator란?

AlamofireNetworkActivityIndicator는 Alamofire의 확장 라이브러리로, 네트워크 요청이 진행 중일 때 상태 바의 인디케이터를 표시하는 기능을 제공합니다. 이 기능은 사용자에게 네트워크 통신이 진행되고 있는지 시각적으로 알려주어 사용자 경험을 향상시킬 수 있습니다.

네트워크 로그 기록하기

네트워크 로그를 기록하기 위해 먼저 AlamofireNetworkActivityIndicator을 설치해야 합니다. Podfile에 다음과 같이 추가합니다.

pod 'AlamofireNetworkActivityIndicator'

설치 후, 프로젝트를 빌드하고 AppDelegate.swift 파일을 엽니다. 다음과 같이 import AlamofireNetworkActivityIndicator를 추가해줍니다.

import AlamofireNetworkActivityIndicator

이제 application(_:didFinishLaunchingWithOptions:) 메서드에서 networkActivityIndicatorManager.isEnabled를 true로 설정해 네트워크 인디케이터를 활성화합니다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // ...
    NetworkActivityIndicatorManager.shared.isEnabled = true
    // ...
    return true
}

이제 네트워크 로그를 기록하기 위한 SessionDelegate 클래스를 만듭니다. 이 클래스를 사용하면 Alamofire가 수행하는 통신 동작을 추적하여 로그로 기록할 수 있습니다.

class LogSessionDelegate: SessionDelegate {
    override func taskDidResume(_ task: URLSessionTask) {
        super.taskDidResume(task)
        print("Task Resumed: \(task)")
    }
    
    override func taskDidComplete(_ task: URLSessionTask, error: Error?) {
        super.taskDidComplete(task, error: error)
        if let error = error {
            print("Task Completed with Error: \(error.localizedDescription)")
        } else {
            print("Task Completed Successfully")
        }
    }
}

이제 AppDelegate.swift 파일에서 logSessionDelegate 변수를 추가하고, URLSessionConfigurationdelegate 속성으로 설정합니다.

class AppDelegate: UIResponder, UIApplicationDelegate {
    
    // ...
    
    var logSessionDelegate = LogSessionDelegate()
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        NetworkActivityIndicatorManager.shared.isEnabled = true
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 30
        configuration.timeoutIntervalForResource = 30
        configuration.urlCache = nil
        configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
        configuration.httpAdditionalHeaders?["Content-Type"] = "application/json"
        configuration.protocolClasses?.insert(HTTPLogger.self, at: 0)
        configuration.protocolClasses?.insert(HTTPDelayProtocol.self, at: 0)
        configuration.protocolClasses?.insert(HTTPCacheableProtocol.self, at: 0)
        configuration.protocolClasses?.insert(HTTPNoCacheProtocol.self, at: 0)
        configuration.protocolClasses?.insert(NetworkPinningProtocol.self, at: 0)
        configuration.protocolClasses?.insert(SocksProxyProtocol.self, at: 0)
        configuration.protocolClasses?.insert(logSessionDelegate, at: 0) // Add LogSessionDelegate
        // ...
        return true
    }

    // ...
}

코드를 실행하고 네트워크 요청을 하면, 콘솔에 각 통신 동작에 대한 로그가 출력됩니다.

마무리

이번 글에서는 AlamofireNetworkActivityIndicator와 함께 Swift에서 네트워크 로그를 기록하는 방법에 대해 알아보았습니다. 네트워크 로그를 통해 문제 발생 시 원인을 파악하고 디버깅에 도움을 받을 수 있습니다. 앱 개발시 네트워크 로그를 기록하는 습관을 가지고 진행하면 더 효과적인 디버깅이 가능해질 것입니다.

참고 자료