네트워크_상태_변경_문제_해결 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

💥 네트워크 상태 변경 문제 트러블 슈팅

문제 정의

image

 NetworkManager_FLP      com.sec.location.nsflp2              I  updateLostDataState, type=MOBILE_DATA
2024-11-28 14:55:00.046  4742-4835  NetworkManager_FLP      com.sec.location.nsflp2              I  Success to add new network info by lostDataState, Service=0 / Network=LTE(band=5, ch=2500) / MobileData=false, roaming=false / WIFI=false, conn=false / BT=false, conn=false
2024-11-28 14:55:00.051  3812-3974  NetworkManager          com.and04.naturealbum                D  Network lost: 226
2024-11-28 14:55:00.052  3812-3974  NetworkManager          com.and04.naturealbum                D  updateNetworkState - Previous: 1, New: 1, Capabilities: [ Transports: CELLULAR Capabilities: SUPL&RCS&INTERNET&NOT_RESTRICTED&TRUSTED&NOT_VPN&VALIDATED&NOT_ROAMING&FOREGROUND&NOT_CONGESTED&NOT_SUSPENDED&NOT_VCN_MANAGED LinkUpBandwidth>=2340Kbps LinkDnBandwidth>=20984Kbps Specifier: <TelephonyNetworkSpecifier [mSubId = 1]> SubscriptionIds: {1} UnderlyingNetworks: Null]
2024-11-28 14:55:00.052  3812-3974  NetworkManager          com.and04.naturealbum                D  Network state remains unchanged
2024-11-28 14:55:12.196  4742-4835  NetworkManager_FLP      com.sec.location.nsflp2              W  updateServiceStateChanged, serviceState=0 / isRegistered=true / channel=2500 / networkTypeName=LTE / nr=false
2024-11-28 14:55:12.197  4742-4835  NetworkManager_FLP      com.sec.location.nsflp2              W  updateServiceStateChanged, serviceState=0 / isRegistered=true / channel=2500 / networkTypeName=LTE / nr=false

  • 네트워크 상태 변경 시 UI가 정확히 갱신되지 않는 문제가 발생하였다.
  • 특히, 모바일 데이터를 비활성화하거나 Wi-Fi를 전환할 때, UI가 이전 네트워크 상태를 유지하거나 잘못된 상태를 반영하였다.
  • 로그 분석 결과, 네트워크가 끊겼음에도 불구하고 상태 값이 DISCONNECTED로 업데이트되지 않거나, onLost 콜백이 호출된 이후에도 Capabilities가 이전 상태를 유지하는 경우가 관찰되었다.

문제 해결 방법

  1. onLost 콜백에서 네트워크 상태를 명시적으로 DISCONNECTED로 설정한다.
  2. activeNetworkCapabilities를 동시 검증하여 네트워크 상태를 일관되게 반영한다.
  3. 상태 전환 조건을 명확히 하여, 상태가 변경될 때만 _networkState 값을 갱신한다.
  4. 로그를 추가하여 상태 전환 과정을 확인할 수 있도록 한다.

문제 해결 진행

1. 초기 증상 확인 및 로그 분석

  • 네트워크 상태를 전환할 때 onLost 콜백이 호출되었으나, _networkState 값이 변경되지 않는 경우가 다수 발생하였다.

  • 특히, Capabilities가 이전 상태를 유지하여 네트워크가 여전히 연결된 것으로 잘못 판단되었다.

  • 예시 로그:

    updateNetworkState - **Previous: 1, New: 1**, Capabilities: [이전 상태 정보]
    Network state remains unchanged
    
  • 이를 통해 상태 업데이트 로직이 정확하지 않다는 것을 파악하였다.

2. onLost 콜백 수정

  • onLost 콜백에서 명시적으로 _networkState.valueDISCONNECTED로 설정하였다.

  • 수정 전: 상태 변경 여부를 Capabilities에만 의존하여, 네트워크가 실제로 끊어졌을 때 상태가 반영되지 않았다.

  • 수정 후: 네트워크가 끊기면 Capabilities 상태와 관계없이 즉시 DISCONNECTED로 전환하도록 하였다.

    override fun onLost(network: android.net.Network) {
        super.onLost(network)
        Log.d("NetworkManager", "Network lost: $network")
    	   // 전: updateNetworkState()
        _networkState.value = NetworkState.DISCONNECTED
    }
    

3. updateNetworkState 로직 개선

  • activeNetworkCapabilities를 동시에 확인하여 상태를 정확히 판단하도록 수정하였다.

  • activeNetworknull이거나 Capabilitiesnull인 경우, 네트워크 상태를 DISCONNECTED로 설정하였다.

  • 수정된 로직:

    private fun updateNetworkState() {
        val currentNetwork = connectivityManager.activeNetwork
        val caps = connectivityManager.getNetworkCapabilities(currentNetwork)
    
        val newState = when {
            currentNetwork == null || caps == null -> NetworkState.DISCONNECTED
            caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> NetworkState.CONNECTED_WIFI
            caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> NetworkState.CONNECTED_DATA
            else -> NetworkState.DISCONNECTED
        }
    
        if (_networkState.value != newState) {
            Log.d("NetworkManager", "Network state updated to $newState")
            _networkState.value = newState
        } else {
            Log.d("NetworkManager", "Network state remains unchanged")
        }
    }
    
    

4. 네트워크 상태 변경 시나리오 테스트

  • 다음 네트워크 상태 변경 시나리오를 테스트하였다:

    1. Wi-Fi 연결 → Wi-Fi 비활성화 → 모바일 데이터 활성화
    2. 모바일 데이터 활성화 → 모바일 데이터 비활성화 → Wi-Fi 연결
    3. 네트워크 모두 비활성화 → Wi-Fi 연결
    4. 네트워크 모두 비활성화 → 모바일 데이터 활성화
  • 각 상태 전환에서 로그를 통해 상태 값이 적절히 갱신되는 것을 확인하였다.

    Network state updated to DISCONNECTED
    Network state updated to CONNECTED_WIFI
    

결과

  1. 네트워크 상태 변경이 정확히 반영되도록 로직을 개선하였다.
  2. 모든 테스트 시나리오를 성공적으로 통과하여 Wi-Fi와 모바일 데이터 전환 시 UI 갱신이 정상적으로 이루어졌다.
  3. 문제의 주요 원인은 onLost에서 명시적으로 상태를 반영하지 않았던 점과 Capabilities 갱신 과정에서 발생한 불일치였다.
  4. 개선된 NetworkManager는 네트워크 상태를 정확히 반영하며, 향후 디버깅이 용이하도록 자세한 로그를 추가하였다.

이번 트러블 슈팅 과정을 통해 비동기적으로 작동하는 네트워크 상태 갱신 로직의 중요성과 명시적 상태 관리의 필요성을 배울 수 있었다.