결제 알림 오프라인 유실 없애고 자동수령 안정화
목차
시작
오늘은 메신저 자동수령 안정화 작업을 한 바퀴 돌렸음. 단말에서 결제 알림을 잡아 백엔드로 흘려보내는 모듈인데, 네트워크 끊겼을 때 알림이 통째로 사라지는 게 오래된 골칫거리였음. 한 방에 잡으려고 세 갈래로 손댔음.
오프라인 큐잉
기존엔 알림 받자마자 바로 HTTP 호출. 지하철/엘리베이터에서 끊기면 그대로 소실됐음. 로컬 DB에 1차 적재 후, 워커가 주기적으로 플러시하는 구조로 바꿈.
// 알림 수신 시
local.notif().insert(raw) // 1차: 로컬 즉시 저장
worker.enqueueIfIdle() // 2차: 송신 시도 (실패해도 OK)
핵심은 "수집과 송신 분리". 송신 실패해도 원본은 남고, 다음 워커 사이클에서 재시도.
| 항목 | 변경 전 | 변경 후 |
|---|---|---|
| 오프라인 시 | 알림 소실 | 로컬 큐 적재 |
| 재시도 | 없음 | 지수 백오프 |
| 중복 방지 | 서버 단 | 단말 해시 키 |
메시지 파싱 개선
메신저 알림 본문 포맷이 자잘하게 바뀌면서 정규식 한 줄로 우격다짐하던 게 깨짐. 토큰 단위로 쪼개 파서 함수를 갈래별로 분리했음.
- 금액/통화/계좌 분리 추출
- 보낸이·받는이 라벨 위치 변동 흡수
- 미인식 알림은 raw 그대로 남기고 sync flag만 false 처리
raw 보관이 의외로 효자였음. 파서 버그 회귀 잡을 때 과거 알림 재처리 가능했고, 누락 추적 시 증거로 그대로 갖다 씀.
자동수령 강화
알림 권한, 배터리 최적화 예외, 접근성 권한 — 단말마다 흐름이 달라 초기 설정 화면이 다음 단계를 자꾸 누락하던 이슈가 있었음. 권한 상태 머신을 명시화하고, 미충족 항목이 있으면 진입 자체를 막도록 바꿈.
- 권한 체크 로직을 단일 진입점으로 통합
- 빠진 권한별 가이드 다이얼로그 노출
- 백그라운드 진입 시 헬스체크 → 실패하면 사용자 알림
의존성 정리
빌드 스크립트도 같이 손봤음. 안 쓰는 라이브러리 두 개 빼고, 로컬 DB 마이그레이션 경로를 추가했음. 마이그레이션 빠뜨리면 첫 실행에 그냥 죽어버려서 QA 단말 재설치 사태를 두 번 겪었음. 이번엔 fallback-to-destructive 옵션 빼고 정직하게 마이그레이션 코드를 작성. 한 번 데여보니 마이그레이션 누락은 코드 리뷰 체크리스트에 박아두는 게 나아 보임.
회고
큐잉이 제일 임팩트 컸음. 그동안 "왜 일부 결제만 누락되지?" 추적하느라 파트너 쪽에 사과 회신 여러 번 보냈는데, 원인 대부분이 네트워크 일시 단절이었던 걸로 추정됨. 운영 한 주 더 돌려보고 누락률 지표를 다시 확인할 예정. 단말 모델별로 권한 흐름이 또 어떻게 갈라지는지가 다음 숙제임.
다음
댓글 0
첫 댓글 달아줘.