[Android] 시험 및 학습 타이머 앱 백그라운드 시간 멈춤과 세션 복구 구현하기
운영하다 보면 타이머 기능이 필요한 앱을 만들 때가 있습니다. 저의 경우 수험생들을 위한 시험 타이머 앱을 사이드 프로젝트로 개발했었는데, 사용자가 일시정지를 누르거나 앱을 잠깐 나갔다 돌아올 때 시간이 어긋나는 문제가 자꾸 발생하더군요. 처음에는 단순하게 남은 시간( remainingSeconds )을 변수나 로컬 저장소에 매초 저장하면 될 줄 알았는데, 화면이 꺼지거나 시스템이 프로세스를 강제 종료하면 타이머가 초기화되거나 실제 흐른 시간과 맞지 않는 버그가 생겼습니다. 이래저래 고민하다가 정리한 안정적인 타이머 세션 복구 구조를 기록해 둡니다. 나중에 저도 자꾸 까먹을 때마다 다시 보려고 정리하는 목적도 있습니다. 내가 겪은 문제와 헷갈린 지점 타이머 앱을 단순하게 만들면 아래와 같은 상황에서 무조건 버그가 터집니다. 앱을 백그라운드로 보낸 동안 시간이 멈춘 것처럼 보이는 현상 화면 회전(Configuration Change)이나 시스템에 의한 프로세스 재생성 시 타이머 초기화 사용자가 직접 누른 일시정지와 앱이 중단된(백그라운드) 상태를 구분하지 못함 강제 종료 후 재실행 시 이전 세션을 이어갈지 새로 시작할지 명확한 기준이 없음 남은 시간을 매초 디스크에 저장하여 배터리와 저장소에 불필요한 부담을 줌 핵심은 타이머를 매초 화면을 갱신하는 '초 단위 카운터'로 보면 안 된다는 점입니다. 운영 관점에서는 타이머를 "시작 시각, 누적 진행 시간, 일시정지 상태를 가진 하나의 세션(Session)"으로 관리해야 안전합니다. 해결 방법: 남은 시간이 아닌 '세션 데이터' 저장하기 매초 남은 시간을 직접 저장하는 방식은 비효율적이고 부정확합니다. 대신 시간을 언제든 역산해서 얻을 수 있는 '기준값'들을 세션 모델로 묶어서 상태가 바뀔 때만 디스크에 저장하는 것이 좋습니다. 제가 정의해서 사용한 세션 데이터 구조입니다. 저장 항목 설명 필요한 이유 sessionId 현재 시험 또는 타이머 세션 ID 이전...