결제 수단 추가로 드러난 정산 쿼리 누락과 분기 구조 개선
목차
새 결제 수단 붙이기
이커머스에서 결제대행사 한 곳을 추가함. 기존엔 카드/가상계좌만 받던 흐름에 새 수단이 끼어들면서, 결제 요청 분기에서 슬슬 균열이 보이기 시작함.
처음엔 그냥 if 한 줄 더 넣고 끝날 줄 알았는데, 실제로 붙여보니 응답 콜백 포맷이 달라서 파싱 단계부터 다시 짜야 했음. 단순 추가가 아니라 "이미 너무 비대해진 분기"를 건드리는 작업이었던 것.
무엇이 문제였나
- 결제 수단마다 콜백 필드명이 달라서 매번 새 분기가 늘어나는 구조
- PENDING → CONFIRMED 상태 전환 트리거가 수단별로 흩어져 있음
- 통계 쿼리가 결제 수단을 하드코딩으로 WHERE 절에 박아둔 상태
세 번째가 제일 심각했음. 새 수단 하나 추가했더니 리포트용 쿼리 7개가 동시에 누락 데이터를 뱉기 시작함.
쿼리 개선 포인트
| 항목 | 변경 전 | 변경 후 |
|---|---|---|
| 결제 수단 필터 | 하드코딩 IN 절 | 메타 테이블 조인 |
| 상태 분기 | CASE WHEN 5단 | 상태 코드 매핑 |
| 인덱스 | 단일 컬럼 | (수단, 상태, 일자) 복합 |
복합 인덱스로 바꾼 게 컸음. 정산용 일별 집계 쿼리가 2.3초 → 180ms 로 떨어짐. 옵티마이저가 인덱스 머지를 안 타서 그동안 풀스캔 비슷하게 돌고 있었던 것.
-- before: 새 수단 추가할 때마다 7곳 수정
WHERE pay_type IN ('CARD','VBANK','ACCOUNT')
-- after: 메타 조인으로 자동 반영
JOIN pay_method m ON m.code = c.pay_type
WHERE m.is_active = 1
배운 것
- 결제 수단 추가는 "데이터 모델 추가"임. 컨트롤러 분기 추가가 아님. 이거 깨닫는 데 반나절 씀.
- 콜백 파서를 수단별 인터페이스로 분리해두니, 다음 결제대행사 붙일 때 같은 컨트롤러를 안 건드려도 됨
- 리포트 쿼리는 새 수단 추가 시 "검사 대상 1순위". 데이터는 조용히 누락되니까 알람도 안 옴
- PENDING/CONFIRMED 전환 로직은 수단별로 보지 말고 상태 머신 한 곳에 모으는 게 맞음. 다음 리팩터링 후보로 적어둠
PG 한 곳 더 붙일 일이 곧 있는데, 이번에 분리해둔 파서 인터페이스가 얼마나 잘 굴러갈지 그때 진짜 검증될 듯. 일주일짜리 작업이 이틀로 줄면 성공.
다음.
댓글 0
첫 댓글 달아줘.