DO NOT OVER SYNC!
최신 소셜 피드, 뉴스 및 일기 예보처럼 실시간 데이터를 사용자에게 제공하려면 동기화를 통해 최신 상태로 유지하는 것이 중요합니다. 그러나 너무 자주 동기화하면 여러 가지 문제가 발생할 수 있습니다.
잦은 동기화가 앱 성능에 미치는 영향과 이를 개선할 수 있는 몇 가지 방법에 대해 정리했습니다.
많은 앱들이 사용자에게 항상 새로운 데이터를 제공하기 위해 동기화를 하고 있습니다.
만약 이를 위해 필요 이상으로 서버에 데이터를 요청한다면 몇 가지 문제가 발생할 수 있습니다.
안드로이드 기기 안에는 지역 통신탑과 소통하고 대량의 데이터를 전송하는 작은 칩이 있습니다.
이 칩은 대기 모드에서 있다가 데이터가 전송되어야 할 때 가동되는데 이를 위해 배터리를 소모하게 됩니다.
이 뿐만 아니라 데이터 패킷을 전송한 후에도 혹시 모를 수신을 대비해 20초에서 60초 동안 켜진 채로 대기하기 때문에 더더욱 배터리를 소모하게 됩니다.
즉, 처음 가동될 때, 데이터 패킷을 주고받을 때, 대기할 때 배터리를 계속해서 소모하게 됩니다.
만약 이러한 상황이 빈번하게 일어나게 된다면 배터리 소모 문제가 많이 일어나게 됩니다.
당연한 말이지만 제한된 데이터 사용 요금제를 쓰는 사용자에게는 좋지 않습니다.
그리고 잦은 동기화로 인해 접속이 느려진다면 데이터 송수신을 위해 무선을 오래 연결하고, 결국 배터리 문제도 일으키게 됩니다.
"설정-연결-데이터 사용"을 통해 앱별로 사용한 데이터를 확인할 수 있습니다.
뽐뿌는 뭐하느라 저렇게 많이 썼지....
제한된 배터리와 네트워크 사용량으로 인해 잦은 동기화는 성능 상 좋지 않습니다.
하지만 현실적으로 사용자들에게 최신 데이터를 보여주기 위해서는 동기화를 해야 합니다.
다행히 사용자에게 최신 데이터를 보여주면서 동기화 요청을 줄일 수 있는 몇 가지 방법이 있습니다.
우선 당장 해야 할 동기화와 조금 지연해도 괜찮을 동기화를 분류해야 합니다.
예를 들어, 첫 번째 경우처럼 사용자가 직접 새로운 정보 업데이트를 요청한다면, 바로 동기화를 해야 합니다.
하지만 두 번째와 세 번째 경우처럼 일정한 간격으로 일어나는 동기화는 앱 성능을 향상하기 위해 조금 지연해도 괜찮습니다.
동기화를 위해 일정한 간격으로 서버에서 정보를 요청해서는 안됩니다.
만약 새로운 정보가 없다면 네트워크 사용량과 배터리를 낭비만 하기 때문입니다.
대신 새로운 정보가 있을 때 서버에서 앱에 신호를 보내주는 Firebase 클라우드 메시징(FCM) 같은 서비스를 활용하는 것이 좋습니다.
필요한 경우에만 동기화를 하기 때문에 배터리 소모도 줄일 수 있고, 서버와 통신 횟수도 줄여 네트워크 사용량도 줄일 수 있습니다.
앞서 설명한 대로 일정한 간격으로 동기화를 하면 배터리나 네트워크 같은 리소스 낭비가 발생할 수 있습니다.
이를 방지하기 위해 데이터 응답을 기반한 Back-off 패턴을 적용할 수 있습니다.
예를 들어 새로운 데이터가 없으면 다시 확인할 때까지 대기시간을 두 배로 늘리고, 그다음에도 아무것도 없으면 대기시간을 또 두 배로 늘립니다.
이렇게 하면 서버 측 데이터의 업데이트에 따라 효율적으로 데이터를 동기화할 수 있습니다.
안드로이드 기기의 상태에 따라 동기화 빈도를 조정할 수 도 있습니다.
충전이 될 때나 Wi-Fi에 접속하고 있을 때는 배터리나 네트워크 문제를 해결할 수 있기 때문에 동기화를 하기에 문제가 없습니다.
다행히 이런 패턴을 쉽게 적용할 수 있도록 GCMNetworkManager라는 Google Play 서비스 API가 제공되고 있습니다.
https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager
GCMNetworkManager는 서버와 데이터를 동기화하는 메커니즘인 "send-to-sync" 기능을 제공하는 클래스입니다.
네트워크 지향 작업을 예약하고 Google Play 서비스가 시스템 전체에서 일괄 네트워크 작업을 수행하도록 할 수 있습니다. 그리고 네트워크 연결, 네트워크 재시도 및 Back-off와 같은 일반적인 패턴 구현이 크게 단순 해집니다.
배움엔 끝이 없습니다.