brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Mar 27. 2017

Optimizing Network Request

DO NOT OVER SYNC!

Optimizing Network Request Frequencies


최신 소셜 피드, 뉴스 및 일기 예보처럼 실시간 데이터를 사용자에게 제공하려면 동기화를 통해 최신 상태로 유지하는 것이 중요합니다. 그러나 너무 자주 동기화하면 여러 가지 문제가 발생할 수 있습니다.


잦은 동기화가 앱 성능에 미치는 영향과 이를 개선할 수 있는 몇 가지 방법에 대해 정리했습니다.




DO NOT OVER SYNC!


#01 Sync a lot


많은 앱들이 사용자에게 항상 새로운 데이터를 제공하기 위해 동기화를 하고 있습니다.

만약 이를 위해 필요 이상으로 서버에 데이터를 요청한다면 몇 가지 문제가 발생할 수 있습니다.




Performance Issue #01

Destroys the user's battery


#02 Radio life cycle


안드로이드 기기 안에는 지역 통신탑과 소통하고 대량의 데이터를 전송하는 작은 칩이 있습니다.

이 칩은 대기 모드에서 있다가 데이터가 전송되어야 할 때 가동되는데 이를 위해 배터리를 소모하게 됩니다.

이 뿐만 아니라 데이터 패킷을 전송한 후에도 혹시 모를 수신을 대비해 20초에서 60초 동안 켜진 채로 대기하기 때문에 더더욱 배터리를 소모하게 됩니다.


#03 Network & Battery


즉, 처음 가동될 때, 데이터 패킷을 주고받을 때, 대기할 때 배터리를 계속해서 소모하게 됩니다.

만약 이러한 상황이 빈번하게 일어나게 된다면 배터리 소모 문제가 많이 일어나게 됩니다.




Performance Issue #02

Restricted-usage network data



당연한 말이지만 제한된 데이터 사용 요금제를 쓰는 사용자에게는 좋지 않습니다.

그리고 잦은 동기화로 인해 접속이 느려진다면 데이터 송수신을 위해 무선을 오래 연결하고, 결국 배터리 문제도 일으키게 됩니다.

"설정-연결-데이터 사용"을 통해 앱별로 사용한 데이터를 확인할 수 있습니다.
뽐뿌는 뭐하느라 저렇게 많이 썼지....




Sync Less. Win More.


제한된 배터리와 네트워크 사용량으로 인해 잦은 동기화는 성능 상 좋지 않습니다.

하지만 현실적으로 사용자들에게 최신 데이터를 보여주기 위해서는 동기화를 해야 합니다.

다행히 사용자에게 최신 데이터를 보여주면서 동기화 요청을 줄일 수 있는 몇 가지 방법이 있습니다.




Types of networking requests


#05 Types of networking requests


우선 당장 해야 할 동기화와 조금 지연해도 괜찮을 동기화를 분류해야 합니다.

예를 들어, 첫 번째 경우처럼 사용자가 직접 새로운 정보 업데이트를 요청한다면, 바로 동기화를 해야 합니다.

하지만 두 번째와 세 번째 경우처럼 일정한 간격으로 일어나는 동기화는 앱 성능을 향상하기 위해 조금 지연해도 괜찮습니다.




Solution #01

Cloud push is awesome



동기화를 위해 일정한 간격으로 서버에서 정보를 요청해서는 안됩니다.

만약 새로운 정보가 없다면 네트워크 사용량과 배터리를 낭비만 하기 때문입니다.


대신 새로운 정보가 있을 때 서버에서 앱에 신호를 보내주는 Firebase 클라우드 메시징(FCM) 같은 서비스를 활용하는 것이 좋습니다.

필요한 경우에만 동기화를 하기 때문에 배터리 소모도 줄일 수 있고, 서버와 통신 횟수도 줄여 네트워크 사용량도 줄일 수 있습니다.




Solution #02

Back-off pattern


#07 Back-off pattern


앞서 설명한 대로 일정한 간격으로 동기화를 하면 배터리나 네트워크 같은 리소스 낭비가 발생할 수 있습니다.

이를 방지하기 위해 데이터 응답을 기반한 Back-off 패턴을 적용할 수 있습니다.


예를 들어 새로운 데이터가 없으면 다시 확인할 때까지 대기시간을 두 배로 늘리고, 그다음에도 아무것도 없으면 대기시간을 또 두 배로 늘립니다.

이렇게 하면 서버 측 데이터의 업데이트에 따라 효율적으로 데이터를 동기화할 수 있습니다.





Solution #03

GCMNetworkManager class


#08 State of the device


안드로이드 기기의 상태에 따라 동기화 빈도를 조정할 수 도 있습니다.

충전이 될 때나 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와 같은 일반적인 패턴 구현이 크게 단순 해집니다.




배움엔 끝이 없습니다.


작가의 이전글 Cachematters for networking
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari