NetworkCallback: 개념, 응용 및 Android에서 네트워크 처리

저자: IT Sectr 게시일: 2026-03-10 읽는 시간: 9 분

NetworkCallback은 ConnectivityManager를 통해 네트워크 상태 변경을 모니터링하기 위한 Android SDK의 추상 클래스입니다. Android Developers Documentation (2025)에 따르면, NetworkCallback을 사용하면 앱이 연결, 연결 해제 또는 연결 특성 변경에 신속하게 대응할 수 있습니다. ConnectivityManager.NetworkCallback은 시스템 서비스를 지속적으로 폴링하지 않고도 네트워크 유형, 캡티브 포털 및 인터넷 손실에 대한 자세한 정보를 제공합니다.

핵심 요점

  • NetworkCallback은 ConnectivityManager를 통해 네트워크 상태를 추적하기 위한 Android SDK 내장 추상 클래스입니다.
  • onAvailable 메서드는 기기가 네트워크에 연결될 때 호출되며, 연결 세부 정보가 포함된 Network 객체를 전달합니다.
  • onLost 메서드는 네트워크 연결이 끊어질 때 트리거되어 앱이 네트워크 요청을 중지할 수 있게 합니다.
  • onCapabilitiesChanged 메서드는 네트워크 기능 변경(인터넷 가용성, 캡티브 포털, 종량제 연결)을 알립니다.
  • 등록은 registerNetworkCallback을 통해, 취소는 앱 라이프사이클 내에서 unregisterNetworkCallback을 통해 수행됩니다.

NetworkCallback이란?

NetworkCallback은 android.net 패키지의 추상 클래스로, Android SDK의 일부입니다. ConnectivityManager 시스템 서비스를 통해 네트워크 연결 상태 변경에 대한 알림을 수신하도록 설계되었습니다.

NetworkCallback 이전에는 개발자들이 BroadcastReceiver를 사용하여 네트워크 변경을 추적했습니다. 이 방식은 매니페스트에 지속적인 등록이 필요하고, 지연이 발생하며, 연결 특성에 대한 자세한 정보를 제공하지 못했습니다. Android 5.0(API 21)은 더 유연하고 성능이 뛰어난 대안으로 NetworkCallback을 도입했습니다.

콜백은 비동기적으로 작동합니다. 앱이 ConnectivityManager를 통해 이벤트를 구독하고, 네트워크 상태가 변경되면 시스템이 콜백 메서드를 호출합니다. 이렇게 하면 네트워크 상태의 정기적인 폴링이 필요 없어 배터리와 CPU 리소스를 절약할 수 있습니다.

Android에서 콜백 작동 방식

ConnectivityManager는 기기의 모든 네트워크 인터페이스(Wi-Fi, 모바일 데이터, Ethernet, VPN)를 관리합니다. 이러한 인터페이스 중 하나라도 변경되면 시스템이 Network 객체를 생성하고 등록된 콜백의 해당 메서드에 전달합니다. 각 Network는 재연결 시 변경되는 고유 식별자를 가집니다.

콜백은 특정 네트워크 유형에 국한되지 않습니다. 모든 사용 가능한 인터페이스를 동시에 추적할 수 있습니다. 연결 유형을 필터링하려면 NetworkRequest 클래스를 사용하여 필요한 전송 프로토콜(Wi-Fi, 셀룰러 데이터, Ethernet)과 네트워크 기능을 지정합니다.

앱에서 NetworkCallback 등록 방법

NetworkCallback 등록은 ConnectivityManager.registerNetworkCallback 메서드를 통해 수행됩니다. 첫 번째 매개변수는 네트워크 요구사항을 설명하는 NetworkRequest.Builder이고, 두 번째는 콜백 인스턴스입니다. 매니페스트에 ACCESS_NETWORK_STATE 권한이 필요합니다.

kotlin
class NetworkMonitor(private val context: Context) {

    private val connectivityManager =
        context.getSystemService(Context.CONNECTIVITY_SERVICE)
            as ConnectivityManager

    private val callback =
        object : ConnectivityManager.NetworkCallback() {

        override fun onAvailable(network: Network) {
            Log.d("Network", "Available: ${network}")
        }

        override fun onLost(network: Network) {
            Log.d("Network", "Lost: ${network}")
        }
    }

    fun register() {
        connectivityManager.registerNetworkCallback(
            NetworkRequest.Builder().build(), callback
        )
    }

    fun unregister() {
        connectivityManager.unregisterNetworkCallback(callback)
    }
}

Activity 및 Fragment에서 등록

앱이 포그라운드에 있을 때 NetworkCallback을 등록하고 백그라운드로 이동할 때 취소하는 것이 좋습니다. Activity에서는 onStart와 onStop을 사용하여 콜백 라이프사이클을 관리합니다. Fragment에서는 onResume과 onPause를 사용합니다.

등록 관리를 간소화하려면 Lifecycle 인식 구성 요소를 사용할 수 있습니다. AndroidX Lifecycle 라이브러리를 사용하면 라이프사이클 상태가 변경될 때 자동으로 콜백을 등록하고 취소하는 사용자 지정 LifecycleObserver를 만들 수 있습니다.

Service에서 등록

백그라운드 작업의 경우 Service 또는 WorkManager에서 등록이 수행됩니다. Android 8+에서는 백그라운드 서비스에 시작 제한이 있습니다. NetworkType을 사용한 WorkManager는 특정 네트워크 상태에서 작업을 실행하는 더 안정적인 방법입니다. 호환성 API와 통합되어 있으며 Doze 모드를 준수합니다.

NetworkCallback 주요 메서드

NetworkCallback는 네트워크 상태가 변경될 때 호출되는 일련의 메서드를 제공합니다. 모든 메서드를 재정의할 필요는 없으며, 앱의 특정 작업에 필요한 것만 구현합니다. onAvailable과 onLost는 기본 연결 모니터링에 최소한으로 필요합니다.

메서드호출 시점매개변수
onAvailable네트워크를 사용할 수 있음Network — 네트워크 객체
onLost네트워크가 끊어지거나 연결 해제됨Network — 네트워크 객체
onCapabilitiesChanged네트워크 기능이 변경됨Network, NetworkCapabilities
onBlockedStatusChanged차단 상태가 변경됨Network, Boolean
onNetworkSuspended시스템에 의해 네트워크가 일시 중단됨Network
onNetworkResumed일시 중단 후 네트워크가 재개됨Network

onCapabilitiesChanged 메서드

이 메서드는 자세한 네트워크 정보를 얻기 위한 핵심입니다. NetworkCapabilities 매개변수에는 플래그가 포함됩니다: NET_CAPABILITY_INTERNET — 인터넷 액세스 가능, NET_CAPABILITY_NOT_METERED — 무제한 연결, NET_CAPABILITY_NOT_ROAMING — 로밍 없음. 신호 지연 시간과 대역폭도 확인할 수 있습니다.

캡티브 포털은 특별한 경우입니다. 포털을 통해 공용 Wi-Fi 네트워크에 연결할 때 onCapabilitiesChanged 메서드는 즉시 INTERNET을 표시하지 않습니다. 네트워크는 처음에 사용할 수 있지만 인터넷 없이 제공됩니다. 브라우저를 통한 인증이 필요합니다. 개발자는 앱 로직에서 이 지연을 고려해야 합니다.

onBlockedStatusChanged 메서드

시스템이 앱의 네트워크 트래픽을 차단할 때 호출됩니다. 예를 들어 데이터 세이버 모드가 활성화되거나 백그라운드 데이터가 제한되는 경우입니다. onBlockedStatusChanged는 앱에 네트워크 요청이 일시적으로 금지되었음을 알리고 로컬 처리로 전환할 수 있게 합니다.

NetworkCallback 구현 예제

인터넷 액세스 모니터링 및 캡티브 포털 처리를 위한 실용적인 NetworkCallback 구현을 살펴보겠습니다. 아래 예제는 NET_CAPABILITY_INTERNET 확인과 Google 서버에 대한 HTTP 요청을 통한 연결 검증을 보여줍니다.

kotlin
val networkCallback = object : ConnectivityManager.NetworkCallback() {

    override fun onCapabilitiesChanged(
        network: Network,
        caps: NetworkCapabilities
    ) {
        val hasInternet = caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_INTERNET
        )
        val isMetered = caps.hasCapability(
            NetworkCapabilities.NET_CAPABILITY_NOT_METERED
        ).not()

        when {
            hasInternet && isMetered ->
                Log.d("Network", "Mobile data connected")
            hasInternet ->
                Log.d("Network", "Wi-Fi connected")
            else ->
                Log.d("Network", "No internet access")
        }
    }

    override fun onLost(network: Network) {
        Log.d("Network", "Connection lost: ${network}")
        // 네트워크 요청 중지
    }
}

캡티브 포털 처리

인증이 필요한 공용 네트워크(카페, 공항)에 연결할 때 시스템은 먼저 onAvailable을 알리지만 onCapabilitiesChanged는 INTERNET을 표시하지 않을 수 있습니다. 이러한 경우 https://www.google.com/generate_204와 같은 안정적인 엔드포인트에 대한 HTTP 요청을 통한 추가 검증이 필요합니다.

요청이 코드 204를 반환하면 인터넷을 사용할 수 있습니다. 리디렉션(301, 302, 307)이 있는 경우 브라우저를 통한 인증이 필요합니다. 이 경우 리디렉션 URL로 WebView 또는 Intent를 열어 포털 인증을 완료할 수 있습니다.

kotlin
fun Context.validateInternet(network: Network) {
    CoroutineScope(Dispatchers.IO).launch {
        try {
            val url = URL("https://www.google.com/generate_204")
            val connection =
                network.openConnection(url) as HttpURLConnection
            connection.instanceFollowRedirects = false
            connection.connect()
            when (connection.responseCode) {
                HttpURLConnection.HTTP_NO_CONTENT ->
                    Log.d("Network", "Internet is available")
                in HttpURLConnection.HTTP_MOVED_PERM
                        ..HttpURLConnection.HTTP_TEMP_REDIRECT ->
                    Log.d("Network", "Captive portal detected")
            }
            connection.disconnect()
        } catch (e: Exception) {
            Log.e("Network", "Validation failed: ${e.message}")
        }
    }
}

다른 네트워크 모니터링 방법과의 차이점

NetworkCallback 이전에는 네트워크 모니터링의 주요 방법이 android.net.conn.CONNECTIVITY_CHANGE 필터를 사용한 BroadcastReceiver였습니다. 이 방식에는 몇 초의 지연, 인터페이스 유형 정보 부족, 기기의 지속적인 깨움으로 인한 전력 소비 증가 등의 심각한 단점이 있었습니다.

현대적인 대안은 LiveData 또는 StateFlow를 NetworkCallback과 결합하는 것입니다. 이 패턴은 콜백을 반응형 스트림으로 래핑하여 상태 변경을 UI에 자동으로 알리는 것입니다. 예를 들어 NetworkStatus 유형의 MutableStateFlow가 콜백 메서드 내에서 업데이트되고 ViewCollector가 변경 사항을 구독합니다.

방법API Level지연 시간세부 수준전력 소비
BroadcastReceiver1+높음낮음높음
NetworkCallback21+낮음높음낮음
ConnectivityManager.getActiveNetwork23+즉시중간없음
NWPathMonitor (iOS)iOS 12+낮음높음낮음

백그라운드 모드 작업

Android 10부터 백그라운드 제한이 강화되어 앱이 백그라운드에 있을 때 NetworkCallback이 호출되지 않을 수 있습니다. 네트워크를 사용할 수 있을 때 데이터 로드와 같은 중요한 작업의 경우 NetworkType.CONNECTED 제약 조건과 함께 WorkManager를 사용하세요. WorkManager는 네트워크 조건이 충족될 때 작업 실행을 보장합니다.

Android 12+에서는 CONNECTIVITY_ACTION에 대한 BroadcastReceiver의 매니페스트 등록에 제한이 있습니다. 개발자는 NetworkCallback으로 마이그레이션하거나 WorkManager를 사용해야 합니다. Google Play 정책은 2022년 8월부터 이 작업에 대한 매니페스트 등록 제거를 요구합니다.

자주 묻는 질문

네트워크에 대한 NetworkCallback과 BroadcastReceiver의 차이점은 무엇인가요?

CONNECTIVITY_CHANGE를 사용한 BroadcastReceiver는 세부 정보 없이 최대 몇 초의 지연으로 네트워크 변경 사실만 제공합니다. NetworkCallback은 비동기적으로 작동하며 Network 객체, 인터페이스 유형, 연결 기능을 제공하고 Android 12+에서 금지된 매니페스트 등록이 필요하지 않습니다.

NetworkCallback을 백그라운드에서 사용할 수 있나요?

Android 10+에서는 백그라운드 제한으로 인해 NetworkCallback 호출이 지연되거나 방지될 수 있습니다. 백그라운드 작업의 경우 NetworkType 제약 조건이 있는 WorkManager를 사용하세요. 절전 모드와 관계없이 조건이 충족될 때 작업 실행을 보장합니다.

NetworkCallback 등록을 취소하려면 어떻게 하나요?

ConnectivityManager에서 unregisterNetworkCallback 메서드를 호출하고 등록 시 사용한 것과 동일한 콜백 인스턴스를 전달합니다. 취소되지 않은 콜백은 시스템이 참조를 유지하므로 메모리 누수가 발생할 수 있습니다. 항상 onStop 또는 onDestroy에서 등록을 취소하세요.

NetworkCallback에 필요한 최소 Android 버전은 무엇인가요?

NetworkCallback은 API Level 21(Android 5.0 Lollipop)부터 사용할 수 있습니다. 이전 버전의 기기에서는 BroadcastReceiver 또는 AndroidX Activity NetworkCallback과 같은 호환성 라이브러리를 사용하세요. 더 넓은 지원을 위해 API를 래핑합니다.

콜백 없이 현재 네트워크 상태를 확인하려면 어떻게 하나요?

ConnectivityManager.getActiveNetwork(API 23+)를 getNetworkCapabilities와 함께 사용하세요. 이 메서드는 변경 사항을 구독하지 않고 동기적으로 현재 활성 네트워크를 반환합니다. API 21-22의 경우 새 버전에서 더 이상 사용되지 않는 getActiveNetworkInfo를 사용하세요.

요약

  • NetworkCallback은 ConnectivityManager를 통해 지속적인 폴링 없이 비동기 네트워크 모니터링을 위한 Android SDK의 추상 클래스입니다.
  • onAvailable 메서드는 네트워크 연결을 알리고, onLost는 연결 손실을, onCapabilitiesChanged는 네트워크 기능 변경을 알립니다.
  • 등록은 NetworkRequest와 콜백 인스턴스를 사용하여 registerNetworkCallback을 통해 수행됩니다.
  • 라이프사이클에서는 Activity의 onStop과 Fragment의 onPause에서 등록 취소가 필요합니다.
  • 캡티브 포털은 generate_204에 대한 추가 HTTP 요청을 통해 실제 인터넷 액세스를 확인하여 처리됩니다.
  • NetworkCallback은 Android 12+에서 매니페스트에 금지된 CONNECTIVITY_ACTION용 BroadcastReceiver를 대체했습니다.
  • 백그라운드 작업의 경우 직접 NetworkCallback 등록 대신 NetworkType.CONNECTED와 함께 WorkManager를 사용하세요.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기