전 세계 사용자의 절반 이상이 2G 연결에서 앱을 사용합니다. 이들의 경험을 개선하려면 데이터 저장, 큐에 요청 저장 및 최적의 성능을 위한 이미지 처리 등 저속 연결과 오프라인 작업을 위한 최적화가 필요합니다.
여기에 이러한 작업을 하는 방법에 관한 몇 가지 팁을 소개합니다.
이미지 최적화
이미지를 다운로드하기 쉽게 만드는 데에는 여러 가지 방법이 있습니다. 예를 들면 WebP 이미지 제공, 동적으로 이미지 크기 조정 및 이미지 로드 라이브러리 사용입니다.
WebP 이미지 제공
- 네트워크에서 WebP 파일을 제공하여 이미지 로드 시간을 줄이고 네트워크 대역폭을 절약합니다. WebP 파일은 같은 이미지 품질의 PNG 및 JPG 파일에 비해 크기가 작은 경우가 많습니다. 손실(lossy) 설정을 사용하더라도 WebP는 원본과 거의 같은 이미지를 도출할 수 있습니다. Android는 Android 4.0(API 수준 14: Ice Cream Sandwich) 이상에서 손실(lossy) WebP를 지원하고 Android 4.2(API 수준 17: Jelly Bean) 이상에서 무손실/투명 WebP를 지원합니다.
동적으로 이미지 크기 조정
- 앱이 기기 사양에 따라 타겟 렌더링 크기로 이미지를 요청하도록 한 다음, 서버가 적절하게 크기를 조정한 이미지를 제공하도록 합니다. 이렇게 하면 네트워크를 통해 전송되는 데이터를 최소화하고 각 이미지를 보관하는 데 필요한 메모리 양을 줄여주므로 성능과 사용자 만족도가 향상됩니다.
- 사용자가 이미지가 다운로드되기를 기다려야 하는 경우 사용자 환경이 저하됩니다. 적절한 이미지 크기를 사용하면 이러한 문제 해결에 도움이 됩니다. 네트워크 유형 또는 네트워크 품질에 따라서 이미지 크기를 다르게 요청해 보세요. 이 크기는 타겟 렌더링 크기보다 더 작을 수 있습니다.
- 사전 계산된 팔레트 값 또는 저해상도 썸네일과 같은 동적 자리표시자는 이미지를 가져오는 동안 사용자 환경을 개선할 수 있습니다.
이미지 로드 라이브러리 사용
- 앱은 같은 이미지를 두 번 이상 가져와서는 안 됩니다. Glide 및 Picasso와 같은 이미지 로드 라이브러리는 이미지를 가져와서 캐시하고 실제 이미지가 준비될 때까지 자리표시자 이미지를 표시하는 후크를 뷰에 제공합니다. 이미지는 캐시되므로 이들 라이브러리는 다음번에 이미지가 요청되면 로컬 복사본을 반환합니다.
- 이미지 로드 라이브러리는 자체 캐시를 관리하여 가장 최근의 이미지를 보관하므로 앱 저장용량이 무한정으로 늘어나지는 않습니다.
네트워킹 최적화
최적의 네트워크 환경을 제공하여 사용자 환경을 향상할 수 있습니다. 예를 들어 앱을 오프라인에서 사용할 수 있도록 하고 WorkManager와 Room을 사용하며 네트워크 요청의 중복을 삭제할 수 있습니다.
오프라인에서 앱을 사용 가능하도록 만들기
- 교외 지역이나 빈곤 지역에서는 기기의 네트워크 연결이 끊기는 경우가 흔합니다. 유용한 오프라인 상태를 만들면 사용자가 언제든지 앱과 상호작용할 수 있습니다. 이렇게 하려면 데이터를 로컬에 저장하고 데이터를 캐시하며 연결이 복원되었을 때 아웃바운드 요청을 큐에 저장하면 됩니다.
- 가능한 경우, 앱이 사용자에게 연결이 끊긴 사실을 알리지 않는 것이 좋습니다. 사용자가 연결이 필수적인 작업을 실행하고 있을 때만 알림을 제공해야 합니다.
- 기기의 연결이 끊긴 경우, 앱은 사용자를 대신하여 연결이 복원되었을 때 실행할 수 있는 네트워크 요청을 일괄 처리해야 합니다. 이러한 예로는 기기가 오프라인일 때도 사용자가 기존 메일을 작성, 보내기, 읽기, 이동 및 삭제할 수 있는 이메일 클라이언트를 들 수 있습니다. 이러한 작업을 캐시한 후 연결이 복원될 때 실행할 수 있습니다. 이렇게 하면 앱은 기기가 온라인이든 오프라인이든 유사한 사용자 환경을 제공할 수 있습니다.
Room을 사용하여 데이터 가져오기 및 캐시
- 앱이 네트워크 조건과 상관없이 최적으로 실행되도록 데이터베이스나 유사한 구조를 사용하여 모든 데이터를 디스크에 저장하는지 확인합니다. Room 지속성 라이브러리를 사용하여 로컬 데이터베이스에 데이터를 캐시하고 WorkManager를 사용하여 기기가 네트워크에 연결되어 있을 때 그 캐시를 업데이트합니다.
- 앱은 네트워크에서 가져온 콘텐츠를 캐시해야 합니다. 후속 요청을 실행하기 전에 앱이 로컬로 캐시된 데이터를 표시해야 합니다. 이렇게 함으로써 기기가 오프라인이든 네트워크가 느리든 불안정하든 간에 앱이 작동하도록 보장합니다.
네트워크 요청 중복 삭제
- 오프라인 우선 아키텍처는 먼저 로컬 저장소에서 데이터 가져오기를 시도하고 이 작업이 실패하면 네트워크로부터 데이터를 요청합니다. 네트워크에서 검색을 마친 데이터는 향후 검색을 위해 로컬로 캐시됩니다. 이렇게 하면 동일한 데이터 조각에 네트워크 요청이 한 번만 발생하고 이후 요청은 로컬에서 충족되도록 합니다. 이를 실현하려면 장기 보유 데이터(대개
android.database.sqlite
또는SharedPreferences
)에 로컬 데이터베이스를 사용하세요. - 이 아키텍처는 한쪽에서는 네트워크에서 데이터를 캐시로 가져오고 다른 쪽에서는 캐시에서 데이터를 검색하여 사용자에게 표시하므로, 오프라인 상태와 온라인 상태 사이의 앱 흐름도 단순화해 줍니다.
- 일시적인 데이터의 경우에는
DiskLruCache
와 같은 제한된 디스크 캐시를 사용합니다. 일반적으로 변경되지 않는 데이터는 네트워크에서 한 번만 요청되고 향후 사용을 위해 캐시되어야 합니다. 이러한 데이터의 예로는 이미지와 비 시간적 문서(예: 뉴스 기사 또는 소셜 게시물)가 있습니다.
데이터 전송 미세 조정
앱이 네트워크 조건에 적응하여 더 나은 사용자 환경을 제공하도록 하는 방법이 몇 가지 있습니다. 예를 들어 앱은 네트워크 요청의 우선순위를 정하여 사용자가 정보를 기다리는 시간을 최소화할 수 있습니다. 또한 네트워크 속도 저하 및 네트워크 연결에서 발생 가능한 변동 사항을 감지하여 이에 적응할 수도 있습니다.
대역폭의 우선순위 지정
- 개발자는 기기가 연결된 네트워크가 안정적이거나 연결이 오래 지속되리라고 가정해서는 안 됩니다. 이러한 이유로, 앱은 가장 유용한 정보를 최대한 빨리 사용자에게 표시하기 위해 네트워크 요청의 우선순위를 지정해야 합니다.
- 불필요할 수도 있는 정보를 사용자가 기다리게 만드는 것보다 관련 정보를 즉각적으로 사용자에게 제공하는 것이 더 나은 사용자 환경입니다. 이렇게 하면 사용자가 기다려야 하는 시간이 줄어들고 속도가 느린 네트워크에서 앱의 유용성이 증가합니다.
- 이를 실현하려면 리치 미디어보다 텍스트를 먼저 가져오도록 네트워크 요청의 순서를 지정합니다. 텍스트 요청은 크기가 더 작고 압축이 더 잘되며 전송이 더 빠른 경향이 있으므로, 유용한 콘텐츠를 앱에서 즉시 표시할 수 있습니다. 네트워크 요청 관리에 관한 자세한 내용은 Android 교육 과정에서 네트워크 사용량 관리를 참고하세요.
더 느린 연결에서 더 적은 대역폭 사용
- 앱이 적시에 데이터를 전송할 수 있는 성능은 네트워크 연결 속도에 달려있습니다. 네트워크의 품질을 감지하고 앱이 이 네트워크를 사용하는 방식을 조정하면 뛰어난 사용자 환경을 제공할 수 있습니다.
- 다음 메서드를 사용하여 기본 네트워크 품질을 감지할 수 있습니다. 앱은 이러한 메서드의 데이터를 사용하여 네트워크 사용을 최적화하고 이를 통해 사용자의 작업에 지속적으로 적시에 응답해야 합니다.
- 연결이 느린 경우에는 저해상도 미디어만 다운로드하거나 아예 다운로드하지 않도록 해보세요. 이렇게 하면 느린 연결에서도 사용자가 앱을 사용할 수 있습니다. 이미지가 없거나 이미지가 아직 로드 중인 경우에는 반드시 자리표시자를 표시해야 합니다. Palette 라이브러리를 사용해 타겟 이미지와 일치하는 자리표시자 색상을 생성하여 동적인 자리표시자를 만들 수 있습니다.
- Android 7.0(API 수준 24) 이상으로 구동되는 기기에서는 사용자가 데이터 절약 모드 설정을 켤 수 있으며 이 경우 데이터 사용량이 최소화됩니다. Android 7.0에서는
ConnectivityManager
를 확장하여 데이터 절약 모드 설정을 감지합니다. 이 기능에 관한 자세한 내용은 데이터 절약 모드를 참고하세요.
네트워크 변경을 감지한 후 앱 동작 변경
- 네트워크 품질은 고정된 것이 아니며 위치, 네트워크 트래픽 및 로컬 인구 밀도에 따라 변합니다. 앱은 네트워크의 변경사항을 감지하고 이에 따라 대역폭을 조정해야 합니다. 이를 통해 앱은 네트워크 품질에 맞게 사용자 환경을 최적화할 수 있습니다. 다음 메서드를 사용하여 네트워크 상태 감지:
- 네트워크 품질이 저하됨에 따라 요청의 크기와 수를 줄입니다. 연결 품질이 개선됨에 따라 요청을 최적의 수준으로 늘릴 수 있습니다.
- 고품질의 무제한 네트워크에서는 데이터를 미리 사용할 수 있도록 데이터 미리 가져오기를 고려해 보세요. 사용자 환경이라는 관점에서 이것은 뉴스 구독 앱이 2G 환경에서는 한 번에 기사를 3건 가져오는 반면 Wi-Fi에서는 한 번에 기사를 20개 가져올 수 있다는 뜻입니다. 네트워크 변경에 따른 앱 동작 조정에 관한 자세한 내용은 Android 교육 과정에서 연결 상태 모니터링을 참고하세요.
- 네트워크 연결이 변경되면 브로드캐스트
CONNECTIVITY_CHANGE
가 전송됩니다. 앱이 포그라운드에 있는 경우registerReceiver
를 호출하여 이 브로드캐스트를 수신할 수 있습니다. 브로드캐스트를 수신한 후에는 현재 네트워크 상태를 재평가하고 UI 및 네트워크 사용량을 적절히 조정해야 합니다. Android 7.0(API 수준 24) 이상에서는 이 수신기를 사용할 수 없으므로, 이를 매니페스트에 선언해서는 안 됩니다. 이에 관한 자세한 내용과 Android 7.0의 다른 변경사항에 관한 자세한 내용은 Android 7.0 변경사항을 참고하세요.
관련 항목
추가 리소스
다양한 연결 속도 지원에 관한 자세한 내용은 다음 리소스를 참고하세요.