배경 및 목표
① Google 정책 변경: Google Play가 2026년 8월 3일 주문부터 chargeback 비용을 개발사에 부담시키기로 하면서 검토 요청에 24시간 안에 사용 증거로 회신해야 방어할 수 있게 됐는데, 네오위즈 글로벌 게임 플랫폼 NEON의 결제 서버에는 회신 경로가 없었음.
② 조용히 실패하던 Apple 알림: Apple 환불 알림 수신 경로가 라이브에서 전건 파싱에 실패하는데도 HTTP 200을 응답해 Apple이 재시도하지 않았고, 알림이 유실되는 줄 아무도 몰랐음.
→ Apple 수신 파이프라인을 다시 세우고 그 위에 두 스토어 공통의 검토 흐름(수신 → 게임 증거 조회 → 마켓 규격 변환 → 제출)을 만들어 기한 안에 자동으로 회신하게 함.
역할
설계 및 주도적 개발 (장애 분석 · 설계 · 결제 서버 · 어드민 · HOP 적용 · 게임 연동 가이드)
주요 업무 및 성과
① 라이브 Apple 알림 장애 복구
- 원인 추적 로그와 코드를 따라가 수동 JWT 디코드와 엄격한 JSON 매핑이 Apple 신규 필드에서 실패하는데, 예외를 삼키는 catch와 상태 코드를 본문으로 돌려주는 컨트롤러가 이 실패를 200으로 가린 것을 밝혀냄.
- 수신 재작성 서명 검증과 디코드는 Apple 공식 라이브러리에 맡기고 위조·손상은 4xx, 서버 오류는 5xx로 응답해 Apple의 재시도가 다시 동작하게 함.
- 무중단 전환 새 경로를 만들지 않고 라이브 게임이 쓰는 기존 엔드포인트에 통합해 환불 처리는 그대로 둔 채 검토 기능만 얹음.
② Google·Apple 지급거절 검토 자동 회신
- 수신과 기한 Google RTDN과 Apple CONSUMPTION_REQUEST를 검토 건으로 저장하고 스토어별 회신 기한(24시간, 12시간)을 함께 기록함.
- 자동 제출 비동기로 게임 증거를 받아 Google reviewRefund, Apple Send Consumption Information V2 규격으로 바꿔 제출하고 실패 건은 수동 대기로 돌려 어드민에서 기한 안에 직접 제출하게 함.
- 중복 방어 알림 UUID를 유니크 키로 잡아 5xx 뒤 재시도로 같은 알림이 다시 와도 한 번만 처리되게 함.
③ 게임 연동 계약 단일화
- 단일 엔드포인트 게임 서버는 증거 API 하나만 구현하고 마켓 구분은 store 파라미터로 받게 해서 Apple을 추가할 때도 게임 응답 계약을 바꾸지 않음.
- 규격 흡수 게임은 환불 의견과 사용률만 답하고, 스토어별 값 변환(사용률 단위 환산, 의견 매핑, 지급 상태 판정)은 플랫폼이 맡음.
- 문서화 JWT 인증 규격, OpenAPI 명세, 연동 가이드를 게임팀에 제공함.
결과
① 2026년 8월 라이브 반영: Google·Apple 지급거절 검토 요청에 게임 증거를 근거로 자동 회신하고 Apple 환불 알림 수신 경로를 복구함.
② HOP 확장: 같은 흐름을 포커 게임 하우스 오브 포커(HOP)의 제재 서비스에도 적용해 Google 검토 요청 수신과 회신을 구현함.
회고
장애 분석에서 가장 위험했던 건 에러가 아니라 200이었다. 실패를 성공으로 응답하니 Apple은 재시도하지 않았고 모니터링도 조용했다. 웹훅 수신부는 실패를 정직하게 돌려줘야 상대 시스템의 재시도가 안전망이 된다는 걸 배웠다. → 두 번째 스토어를 붙일 때는 게임 쪽 계약부터 고정했다. 스토어 규격 차이를 플랫폼 안에서 흡수하니 Apple이 추가돼도 게임 서버는 store 값 하나만 더 읽으면 됐다.