충전탭 오분기·태그 노출·원장 부호 역전 수정
목차
충전 EXPIRED 탭이 PENDING까지 끌어오던 문제
이커머스 어드민에서 충전 내역 탭 분기를 손봤음. EXPIRED 탭을 눌렀는데 만료가 아닌 항목까지 줄줄 따라 나오는 게 보였음. 원인은 단순. 쿼리 조건절에서 상태 파라미터 분기가 OR 연결인 채로 묶여 있어서 EXPIRED 외의 상태도 통과되고 있었음.
-- before
WHERE (#{status} IS NULL OR status = #{status})
OR status = 'PENDING' -- 이게 왜 여기 붙어 있었는지
-- after
WHERE (#{status} IS NULL OR status = #{status})
PENDING 라인은 예전 임시 작업물이 그대로 남아 있던 거였음. 탭 별 카운트랑 실제 목록 건수가 달라서 QA에서 잡혔음. 카운트 쿼리랑 목록 쿼리가 같은 조건 베이스로 가도록 통일.
환불 모달이 태그를 그대로 토하던 문제
환불 사유 모달에 줄바꿈이 <br> 으로 박혀 있었는데 화면엔 글자 그대로 <br> 이 나오고 있었음. 서버에서 내려준 텍스트를 클라이언트에서 이스케이프 처리한 뒤 렌더링했는데, 줄바꿈 변환을 이스케이프 전에 돌리는 바람에 태그까지 같이 escape 돼버린 케이스.
처리 순서를 뒤집었음.
- before:
text → nl2br → escape(태그 전부 문자열화) - after:
text → escape → \n 을 <br> 로 치환
이렇게 가야 사용자 입력은 안전하게 막고, 의도한 줄바꿈만 살아남음. XSS 방어와 가독성을 둘 다 챙기려면 항상 escape 가 먼저고 그 다음 화이트리스트 변환이 들어가야 함을 다시 학인.
원장 부호가 반대였던 문제
이게 제일 골치 아팠음. 파트너 잔액 원장에서 출금 요청은 잔액에서 빠져야 하는데 부호가 양수로 적재되고 있었음. 결과적으로 잔액 합계 화면이 실제 보유 금액과 다르게 부풀려졌음.
| 거래 유형 | 기대 부호 | 실제 들어가던 부호 |
|---|---|---|
| 충전 입금 | + | + (정상) |
| 출금 요청 | − | + (버그) |
| 수수료 차감 | − | − (정상) |
| 환불 회수 | − | + (버그) |
공통점은 "잔액에서 빠져나가는 이벤트인데 절댓값으로만 들어간 케이스". 적재 시점에 부호를 한 번 더 곱해주는 헬퍼를 두고, 거래 타입별 enum 에서 부호 상수를 들고 있도록 정리.
amount_signed = amount_abs * txType.sign()
이렇게 한 번 묶어두니 새 거래 타입 추가 시 부호만 선언하면 끝. 잔액 합계랑 거래 내역 합계가 맞아떨어지는지 검증 쿼리도 같이 돌려둠.
정리
세 버그가 다 결국 "예전 코드 잔재 + 변환 순서 + 부호 규칙" 같은 자잘한 룰 위반이었음. 도메인 룰을 enum/상수로 한 번 박아두면 실수가 줄어든다는 걸 또 체감. 다음
댓글 0
첫 댓글 달아줘.