NWPathMonitor는 iOS 및 macOS의 Network 프레임워크에 속한 클래스로, 기기의 네트워크 경로 상태를 모니터링합니다. Apple Developer Documentation (2025)에 따르면, NWPathMonitor는 애플리케이션이 네트워크 가용성을 추적하고, 인터페이스 유형을 결정하며, 연결 변경에 대응할 수 있게 합니다. NWPathMonitor는 NWPath와의 편리한 콜백을 통해 연결 유형, 데이터 비용 및 인터넷 가용성에 대한 정보를 제공합니다.
주요 사항
NWPathMonitor는 Apple이 iOS 12 및 macOS 10.14 Mojave에서 도입한 Network 프레임워크의 클래스입니다. 기기의 네트워크 경로 변경을 추적하기 위한 현대적인 API를 제공합니다 — 애플리케이션 트래픽이 통과하는 네트워크 인터페이스의 조합입니다.
iOS 12 이전에는 C 기반 SystemConfiguration 프레임워크 위에 구축된 Reachability 라이브러리가 네트워크 모니터링에 사용되었습니다. NWPathMonitor는 더 풍부한 API, 현대적인 연결 유형(VPN, multipath, LTE, 5G) 지원 및 내장 GCD 통합을 갖춘 네이티브 Swift 대안입니다.
NWPathMonitor와 Reachability의 주요 차이점 — NWPath 객체는 이진 "사용 가능/사용 불가" 상태뿐만 아니라 경로의 완전한 그림을 제공합니다: 사용된 인터페이스, 우선순위, 비용, 로밍 상태 및 프록시 및 VPN 기능입니다. 개발자는 네트워크 요청에 대한 결정을 내리기 위한 포괄적인 정보를 얻습니다.
Network 프레임워크는 저수준 C API — CFStream 및 BSD Sockets의 현대적인 대체재로 등장했습니다. watchOS 및 tvOS를 포함한 모든 Apple 플랫폼에서 네트워크 통신을 위한 통합 인터페이스를 제공합니다. NWPathMonitor는 NWConnection, NWListener 및 NWBrowser와 함께 이 프레임워크의 일부입니다.
Network 프레임워크는 Swift로 작성되었으며 비동기 처리를 위해 GCD를 사용합니다. 이는 NWPathMonitor 콜백이 지정된 dispatch queue에서 실행되어 수동 스레드 관리 없이 애플리케이션의 기존 멀티스레딩 아키텍처에 통합됨을 의미합니다.
NWPathMonitor 사용은 클래스 인스턴스를 생성하고 pathUpdateHandler 콜백을 구성하는 것부터 시작됩니다. 그런 다음 클로저가 실행될 dispatch queue와 함께 start 메서드가 호출됩니다. 모니터링은 cancel 메서드로 중지되며, 리소스도 함께 해제됩니다.
import Network
class NetworkMonitor {
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("monitor")
func startMonitoring() {
monitor.pathUpdateHandler = { path in
if path.status == .satisfied {
print("네트워크 사용 가능")
} else {
print("네트워크 사용 불가")
}
}
monitor.start(on: queue)
}
func stopMonitoring() {
monitor.cancel()
}
}
NWPathMonitor는 특정 인터페이스 유형만 모니터링하도록 구성할 수 있습니다. NWInterface.InterfaceType 매개변수(.wifi, .cellular, .wiredEthernet 또는 .loopback)와 함께 초기화자 NWPathMonitor(requiredInterfaceType:)를 사용합니다. 유형이 지정되지 않으면 모니터링이 모든 인터페이스를 포함합니다.
실용적인 예: 스트리밍 애플리케이션은 Wi-Fi만 모니터링하고 셀룰러 데이터로 전환할 때 사용자에게 경고할 수 있습니다. NWPath에서 isConstrained 및 isExpensive 확인을 통해 현재 연결이 요금제인지 또는 속도 제한이 있는지 확인할 수 있습니다.
모니터링은 애플리케이션 시작 또는 포그라운드 진입 시 시작되고, 백그라운드 진입 시 중지되어야 합니다. 전체 애플리케이션에 대해 하나의 NWPathMonitor 인스턴스(싱글톤)를 만들고 프로토콜 또는 서비스 계층을 통해 다른 모듈에서 사용하는 것이 좋습니다.
NWPath는 pathUpdateHandler에 전달되는 객체로, 네트워크 경로의 현재 상태를 설명합니다. 대부분의 네트워크 모니터링 시나리오를 포괄하는 다섯 가지 주요 속성을 포함합니다. NWPath.Status — 세 가지 상태를 가진 열거형: satisfied(사용 가능), unsatisfied(사용 불가), requiresConnection(연결 필요).
| 속성 | 유형 | 설명 |
|---|---|---|
| status | NWPath.Status | 현재 경로 상태: satisfied, unsatisfied, requiresConnection |
| availableInterfaces | [NWInterface] | 사용 가능한 모든 네트워크 인터페이스 목록 |
| gateways | [NWEndpoint] | 라우팅에 사용되는 게이트웨이 목록 |
| isExpensive | Bool | 연결이 요금제인 경우 True(셀룰러 데이터, 개인 핫스팟) |
| isConstrained | Bool | 연결이 속도 제한된 경우 True(Low Data Mode) |
isExpensive 속성은 대량의 데이터를 다루는 애플리케이션에 중요한 플래그입니다. isExpensive = true인 경우, 애플리케이션은 스트리밍 품질을 낮추고, 업데이트 다운로드를 연기하거나 사용자에게 경고해야 합니다. isConstrained는 Low Data Mode가 활성화되었음을 나타냅니다.
인터넷 가용성(단순한 네트워크가 아닌)을 확인하려면 usesInterfaceType 메서드를 사용합니다. 기기가 인터넷 없이 Wi-Fi에 연결된 경우 — NWPath가 satisfied를 표시할 수 있지만 실제 액세스는 없습니다. 이러한 경우 NWConnection을 통한 추가 검증이 필요합니다.
비용 처리, 인터페이스 유형 및 퍼블리셔를 통한 ViewModel 알림을 포함한 고급 NWPathMonitor 구현을 살펴보겠습니다. 이 예제는 네트워크 상태 변경 시 반응형 UI 업데이트를 위해 Combine 프레임워크를 사용합니다.
import Network
import Combine
final class NetworkManager: ObservableObject {
static let shared = NetworkManager()
@Published private(set) var isConnected = true
@Published private(set) var isExpensive = false
private let monitor = NWPathMonitor()
private let queue = DispatchQueue("NetworkMonitor")
private init() {
monitor.pathUpdateHandler = { [weak self] path in
DispatchQueue.main.async {
self?.isConnected = path.status == .satisfied
self?.isExpensive = path.isExpensive
}
}
monitor.start(on: queue)
}
func checkInterface() -> NWInterface.InterfaceType {
let path = monitor.currentPath
if path.usesInterfaceType(.wifi) { return .wifi }
if path.usesInterfaceType(.cellular) { return .cellular }
return .other
}
}
연결이 끊어졌을 때 UI에 알릴 뿐만 아니라 지연된 작업을 수행해야 할 수도 있습니다 — 예를 들어, 나중에 보내기 위해 요청 초안을 저장하는 것입니다. unsatisfied 상태 동안 작업을 축적하고 satisfied가 복원될 때 전송하는 지연 요청 큐를 구현하세요.
이 작업에는 델리게이트가 있는 ReachabilityManager 패턴이 이상적입니다: NWPathMonitor가 관리자에게 알리고, 관리자가 큐와 UI를 업데이트합니다. 상태가 satisfied로 변경되면 큐가 자동으로 비워지고 UI에 연결 복원 표시가 나타납니다.
NWPathMonitor 이전에는 iOS에서 네트워크 모니터링의 표준 솔루션이 SystemConfiguration 위에 구축된 Apple의 Reachability 라이브러리(문서 예제)였습니다. 주요 차이점: Reachability는 C의 SCNetworkReachability를 통해 작동하며, 현대적인 네트워크 유형을 지원하지 않고 이진 가용성 응답만 제공합니다.
NWPathMonitor는 이러한 제한을 해결합니다: Swift로 작성되었으며, VPN, multipath, 5G 및 LTE를 지원하고, 각 인터페이스에 대한 자세한 정보를 제공하며 GCD를 통해 비동기적으로 작동합니다. Reachability는 여전히 최소 iOS 11 이하를 지원하는 프로젝트에서 사용됩니다.
| 특징 | NWPathMonitor | Reachability |
|---|---|---|
| 최소 버전 | iOS 12 | iOS 2 |
| 언어 | Swift (Network) | C (SystemConfiguration) |
| 인터페이스 유형 | Wi-Fi, Cellular, Ethernet, VPN | Wi-Fi, WWAN(일반) |
| isExpensive | 예 | 아니요 |
| 비동기 | GCD (dispatch queue) | RunLoop |
| 다중 인터페이스 | 예 (multipath) | 아니요 |
애플리케이션이 iOS 11 이하를 지원하는 경우, Reachability가 유일한 옵션입니다. iOS 12+ 프로젝트의 경우, NWPathMonitor를 직접 사용하는 것이 좋습니다 — 최신 Swift 코드, Combine 및 SwiftUI와 더 잘 통합됩니다.
Reachability에서 NWPathMonitor로의 마이그레이션은 간단합니다: SCNetworkReachability 호출을 NWPathMonitor로 대체하고 동일한 처리 로직을 유지하면 됩니다. 추상화 계층(NetworkMonitorProtocol)을 통해 애플리케이션의 비즈니스 로직을 변경하지 않고 구현 간에 전환할 수 있습니다.
자주 묻는 질문
NWPathMonitor는 iOS 12.0, macOS 10.14, watchOS 5.0 및 tvOS 12.0부터 사용 가능합니다. 이전 버전을 지원하는 프로젝트의 경우, SystemConfiguration의 Reachability 또는 #available을 통한 조건부 컴파일이 있는 래퍼 라이브러리를 사용하세요.
Satisfied는 트래픽이 하나 이상의 인터페이스를 통과할 수 있음을 의미합니다. Unsatisfied — 사용 가능한 인터페이스가 없습니다. requiresConnection 상태 — 경로가 연결 설정이 필요하며(예: VPN이 연결되지 않음), 트래픽이 일시적으로 통과할 수 없습니다.
NWPath에서 usesInterfaceType 메서드를 사용합니다: Wi-Fi의 경우 path.usesInterfaceType(.wifi), 셀룰러 데이터의 경우 path.usesInterfaceType(.cellular)입니다. 현재 트래픽이 지정된 인터페이스 유형을 통과하는 경우 메서드는 true를 반환합니다.
배터리 절약을 위해 백그라운드에서 모니터링을 일시 중지하는 것이 좋습니다. applicationDidEnterBackground에서 monitor.cancel()을 호출하고 applicationWillEnterForeground에서 start를 다시 시작하면 전력 소비가 줄어듭니다. 중요 작업에는 Background Task를 사용하세요.
NWPathMonitor는 캡티브 포털에서도 satisfied를 표시할 수 있습니다. 실제 인터넷 액세스를 확인하려면 NWConnection을 통해 신뢰할 수 있는 엔드포인트에 HTTP 요청을 수행하세요. 리디렉션이 발생하면 — 포털이 활성 상태이며 WebView에서 인증이 필요합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.