앱 꺼져도 끊기지 않는 다운로드 UX로 전면 개선
목차
다운로드 UX를 다시 짠 이유
기존 다운로드는 화면 떠나면 끊기고, 재진입하면 처음부터 받는 구조였음. "받는 중"인지 "끝났는지" 사용자가 알 길도 없었고, 같은 콘텐츠를 두세 번 다시 받게 만드는 일도 잦았음. 이번에 썸네일 + 백그라운드 서비스 + 세션 유지 + 원탭 받기를 한 번에 묶어서 갈아엎음.
포그라운드 서비스로 끌고 가기
안드로이드는 백그라운드 제약이 빡세서, 화면 꺼져도 다운로드가 살아있게 하려면 포그라운드 서비스가 답이었음. 매니페스트에 서비스 타입을 dataSync로 박고, 진행률을 노티피케이션에 노출해 사용자가 한눈에 보게 함.
- 타입 선언: Android 14부터 포그라운드 서비스 타입 명시 안 하면 죽음
- 수명: 다운로드 큐 비면 자체 종료해서 메모리 점유 최소화
- 알림: 진행률·파일명·취소 버튼을 노티피케이션에 같이 띄움
- DI: 다운로드 모듈은 서비스 스코프로 묶어서 액티비티 종료와 무관하게 살아남게 함
세션 유지 — 의외로 빡셌음
다운로드 도중 앱이 죽거나 토큰이 만료되면 401 떨어지는 케이스가 많았음. 세션을 메모리에만 들고 있던 게 원인.
| 항목 | 변경 전 | 변경 후 |
|---|---|---|
| 토큰 보관 | 메모리 (앱 종료 시 휘발) | 암호화 저장소 |
| 만료 처리 | 401 → 강제 로그아웃 | 자동 재발급 후 재시도 |
| 재개 방식 | 처음부터 다시 | 직전 바이트부터 이어받기 |
이어받기 헤더 처리할 때 서버가 Range 응답을 안 주는 케이스가 있어서, 응답 코드별 분기 로직 따로 뒀음. 200 오면 처음부터, 206 오면 이어받기.
원탭 + 썸네일
리스트에서 다운로드 버튼 누르면 확인 다이얼로그 없이 바로 큐 진입. 진입 장벽 줄이는 게 목표였음. 동시에 썸네일을 미리 캐시해서, 진행 중에도 어떤 콘텐츠인지 시각적으로 보이게 함.
[썸네일] 콘텐츠명
▓▓▓▓▓▓▓░░░ 67%
[취소]
다이얼로그 한 번 빼는 거 별거 아닌 것 같지만, 전환율 차이가 꽤 컸음.
회고
- 포그라운드 서비스 룰은 OS 버전마다 달라서, 타깃 SDK 올릴 때마다 깨지는 지점이 생김. 매니페스트 선언만으로 끝이 아니라 런타임에서 타입 체크까지 필요했음.
- "세션 유지"는 토큰 저장으로 끝이 아니라, 재발급 → 재시도 → 폴백까지 한 흐름으로 묶어야 진짜 유지였음.
- UX는 작은 마찰 하나하나가 누적되는데, 다이얼로그 한 번 빼는 게 가장 큰 변화였음.
다음
댓글 0
첫 댓글 달아줘.