← 뉴스레터

2026-08-20

29,000원이 나갔는데 상품은 안 온 날

19:18, 우리 앱에서 결제 버튼을 직접 눌렀다. 29,000원이 빠져나갔다. 상품은 오지 않았다.

검증에 실패했는데 결제는 완료됐다

3주치 회고의 결론은 단순했습니다. 작업은 열심히 하는데 손에 잡히는 게 없다. 그래서 사장이 실사용자처럼 유료 결제를 눌러봤습니다. 그 한 번이 가장 아픈 방식으로 진짜 버그를 잡아냈습니다.

iOS 결제는 이래야 합니다. 애플이 영수증을 검증해 통과하면, 그때만 상품을 지급 완료 처리한다. 그런데 우리 앱은 애플 검증이 실패(코드 21002)했는데도 완료 처리를 호출했습니다. 그 호출이 애플의 재전달 경로를 끊어버려서, 돈은 나갔는데 상품도 안 오고 복구도 막혔습니다. 안드로이드였으면 개발자가 바로 환불할 수 있지만, 애플은 그것조차 별도 절차와 계약 동의가 필요했습니다.

수리는 세 겹으로 갔습니다. 서버가 영수증을 제대로 검증하도록 고치고 실패 기록을 남기게 했으며, 앱은 검증 실패 시 완료 처리를 절대 못 하도록 막았습니다. 밤늦게 iOS 수리판을 심사에 올렸습니다.

완료 처리는 검증이 성공한 뒤에만 불러야 합니다. 순서가 뒤집히면 돈은 나가고 상품은 사라집니다.

아무 그물에도 안 걸린 사각

더 무서웠던 건, 이 사고가 어떤 경보에도 안 걸렸다는 점입니다. 정상 주문이 0건이라 “매출이 떨어졌다”는 어떤 감시에도 잡히지 않았습니다. 그래서 매출 경로의 침묵 자체를 감지하는 장치를 새로 세웠습니다. 아무 일도 안 일어나는 것이 곧 사고일 수 있다는 걸, 돈을 잃고 나서야 계기로 만들었습니다.

두뇌 이사와 카톡봇

같은 날, 함대의 창구를 새 일꾼으로 옮기는 이사를 종일 이어갔습니다. 새 일꾼용 텔레그램 봇 다섯 개를 만들고 자격을 배선했으며, 지식 인프라를 이어받도록 변환기를 붙였습니다. 카톡봇에서 ”!뉴스”를 물으면 몇 시간 전 사진이 자동으로 딸려붙어 검색 대신 그림 읽기로 새던 구멍도 잡았습니다. 오래된 사진 흔적은 떼고, 방금 올린 사진의 글자는 그대로 읽게 했습니다.

배운 것

가장 아픈 실피해를 세 겹으로 수리하고, 매출 침묵을 감지하는 계기를 새로 세웠습니다. 사고로 시작했지만 그 사고가 결제·감시·품질 세 축을 한꺼번에 단단하게 만든 하루였습니다.

완료 처리는 검증 다음입니다. 그 순서를 지키지 않으면, 돈은 이미 떠난 뒤에야 구멍이 보입니다.

— 강대종 / @ssamssae