futuring
← 읽을거리

정산 코드가 저절로 과거로 돌아간 날

박상진 · 2026-09-20 · 읽는 데 약 6분

고쳐둔 정산이 조용히 옛날 것으로 덮였는데, 화면은 전혀 달라 보이지 않았어요.


9월 3일에 있었던 일이에요. 결론부터 말하면, 몇 주 동안 고쳐온 정산 로직이 한순간에 옛날 버전으로 돌아갔는데 화면상으로는 아무것도 달라 보이지 않았어요. 이 글은 자랑할 만한 이야기는 아니고, 같은 실수를 하지 않으려고 적어두는 거예요.

어쩌다 그렇게 됐나

정산은 데이터베이스 함수로 돌아가요. 기능을 하나씩 붙일 때마다 그 함수를 고쳐야 했는데, 그때마다 새 파일을 만들면서 함수 전체를 복사해 넣었어요. 보안 수정, 점수 도입, 파산 복구 금액 변경, 배치고사, 시즌, 다중 선택지, 마스터 대결, 시드 처리, 시드 지급 제외까지. 세어보니 정산 함수의 전체 사본을 가진 파일이 열 개였어요.

각 파일은 그 시점에서는 맞았어요. 문제는 나중에 그중 하나를 다시 실행하면 그 시점으로 통째로 되돌아간다는 거예요. 실제로 그렇게 됐어요. 정산 함수가 옛날 본문으로 덮이면서, 그 안에서 불러야 할 공통 정산 루틴을 아예 호출하지 않게 됐어요. 다중 선택지 마켓 정산과 시드 처리가 통째로 사라졌는데, 코드도 화면도 똑같았어요.

"실행했다"와 "적용됐다"는 다른 말이에요. 이걸 몸으로 배웠어요.

같은 일이 참여 쪽에도 있었어요

정산을 정리하다가 참여를 받는 함수도 확인했는데 거기는 사본이 여덟 개였어요. 그중 어느 시점에 "마감 시각이 지났으면 거절한다"는 검사를 넣었는데, 그 뒤에 만든 네 개 판본에서 그 검사가 전부 빠져 있었어요. 복사해 오면서 흘린 거예요. 즉 한동안은 결과가 나온 뒤에도 참여가 됐어요.

아무도 그걸 이용한 흔적은 없었지만, 발견하지 못했으면 언젠가 쓰였을 거예요. 이런 건 운이 좋았다고 말하는 게 맞아요.

어떻게 고쳤나

  • 정산과 참여의 본문을 각각 파일 하나에만 두기로 했어요. 고칠 일이 생기면 그 파일만 고쳐요.
  • 마무리 스크립트를 만들었어요. 무엇을 실행했든 마지막에 이걸 한 번 돌리면 정산·참여 함수가 최신 본문으로 다시 덮이고, 내부 함수 권한도 다시 잠겨요.
  • 검증 스크립트를 만들었어요. 임시 계정과 임시 마켓을 만들어서 실제로 참여·정산·취소까지 돌려보고 전부 지워요. 배포 전에 이걸 돌려요.

검증 스크립트를 만들면서 같이 발견한 게 하나 더 있어요. 내부에서만 쓰라고 만든 함수들이 외부 요청으로 그냥 호출되고 있었어요. 데이터베이스가 새로 만든 함수에 기본으로 실행 권한을 주기 때문인데, 막는 구문을 빼먹으면 그대로 열려요. 정산 루틴이 그렇게 열려 있었어요. 누구나 아무 마켓이나 정산할 수 있는 상태였다는 뜻이에요. 지금은 새 함수를 만들 때마다 권한을 닫고, 열린 게 없는지 확인하는 스크립트를 따로 돌려요.

남은 교훈

코드 리뷰로는 이 문제를 절대 못 잡아요. 코드 파일은 아무것도 안 바뀌었거든요. 바뀐 건 데이터베이스 안에 실제로 들어 있는 함수의 본문이었어요. 그래서 지금은 "코드가 맞게 생겼는가"가 아니라 "실제로 돌려봤을 때 맞는 결과가 나오는가"를 확인해요. 배포 전에 돌리는 검증이 통과하지 않으면 올리지 않아요.

Futuring은 무상 포인트로 참여하는 예측 게임이에요. 현금을 넣거나 포인트를 현금으로 바꾸는 길은 없어요. 이 글은 서비스 규칙을 설명한 것이고, 투자 권유나 조언이 아니에요. 내용이 틀렸거나 바뀌어야 한다고 생각하면 sjpark030628@futuring.ai.kr로 알려주세요.

다른 글

80% 확신했을 때 실제로 몇 번 맞혔나

적중률보다 먼저 봐야 하는 숫자, 캘리브레이션 이야기.

좋은 예측 질문의 조건

마켓 하나를 열기 전에 확인하는 다섯 가지.

마켓이 판정되기까지

무엇으로 판정할지 먼저 적고, 마감 뒤에 사람이 확인해요.