운영 중인 앱의 기능으로 오전 08:00가 되면 WorkManager를 통해 고객에게 문자를 전송하고 있다. 만약 문자 전송에 실패할 경우 에러 내역을 파일로 저장하고, 미전송 내역을 남겨 수동으로 전송할 수 있다.
stackTrace: java.net.ConnectException: Failed to connect to ...
어느 날 '예약 문자 전송이 며칠 동안 안 돼서 수동으로 계속 보내고 있다.'는 내용으로 문의가 들어왔다. 에러 내역을 확인해 보니 위와 같은 문구를 확인할 수 있었다.
이 문구는 서버와의 연결에 실패했다는 내용으로 순간적으로 서버가 다운이 되었을까 생각이 들었지만 며칠 동안 동일 시간에 다운이 발생했을 거 같지는 않고, 다른 고객에게서 정상적으로 전송된 로그가 보였다. 특히나 전송 실패 로그가 08:00에 찍히고서 재전송 로그가 1분 내외로 찍힌 것이 이상하다고 느껴 다른 원인을 찾아봤다.
기기 자체에서 서버를 차단하는 경우가 무엇이 있는지 찾아보던 중, '데이터 절약 모드'일 때 백그라운드에서 네트워크를 차단한다는 내용을 봤다. 수동 전송의 경우 사용자가 앱 내에서 직접 처리를 하는 포그라운드 상태라서 문제 상황이 일치했다. 아니나 다를까 사용자분은 데이터 절약 모드를 활성화한 상태였고, 비활성화를 요청드린 다음 날 정상적으로 문자 전송이 된 것을 확인했다.
데이터 절약 모드 체크하기
/**
* 데이터 절약 모드 체크
*/
fun checkMobileDataSaveMode(context: Context): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val status = ConnectivityManagerCompat.getRestrictBackgroundStatus(cm)
return status == ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED
}
데이터 절약 모드를 체크하는 방법은 간단하다. ConnectivityManager를 사용하면 현재 기기가 데이터 절약 모드인지 확인할 수 있다. WorkManager의 doWork() 블록에서 네트워크를 요청하기 전에 해당 함수를 호출하여 데이터 절약 모드가 활성화된 경우 상태 알림을 띄워 사용자가 어떤 사유로 전송에 실패했는지 알 수 있게 처리했다.
'작업 일지' 카테고리의 다른 글
| [Android] API의 배치 처리와 동시성 처리 : chunked vs semaphore (1) | 2025.12.19 |
|---|---|
| [Android] WebView에서 다운로드 동작이 안 되는 이유 (0) | 2025.09.17 |
| [Android] 배송 순서 최적화하기 with TSP (2) | 2025.07.01 |
| [Android][Compose] MaterialCalendarView를 Compose에서 사용하기 (0) | 2024.05.19 |
| [Android] 내비게이션의 다음 경로 정보 구하기#2 (0) | 2024.03.07 |