개발 slecs

충전 취소 엔드포인트 개설과 환불 수수료 정책 유연화

목차

충전 취소 흐름을 시스템에 정식으로 담으며 운영자의 환불 수수료 정책을 유연하게 적용할 수 있게 만든 작업이다.

충전 취소, 왜 이제야?

초기 결제 플랫폼을 설계할 때는 충전(charge) 흐름을 편도로 생각했다. 사용자가 결제하고 잔액이 되고—끝. 하지만 실제 운영하다 보니 오류 결제, 중복 충전, 부정 거래 같은 상황에서 충전 취소가 필수였다. 그동안 이걸 수동으로 처리했는데, 더 이상 미룰 수 없었다. 엔드포인트를 정식으로 열고, 그 과정에서 환불 수수료까지 설정할 수 있게 구조화하는 게 이번 작업의 핵심이다.

환불 수수료, 두 가지 정책을 한 번에

환불할 때 수수료를 어떻게 처리할지가 결정적이었다. 운영 정책이 정해지지 않은 상황에서 나는 두 가지 선택지를 모두 지원하는 방향으로 설계했다.

방식 예시 운영상 장점
퍼센트(%) 환불액의 5% 충전액 규모에 따라 수수료가 자동 조정
정액(원) 1,000원 충전액 크기와 무관하게 일관된 비용 처리

이렇게 두 가지를 모두 넣은 이유는 운영팀의 요청이 시간에 따라 바뀔 수 있기 때문이다. 초기에는 정액으로 시작하다가, 나중에 고액 충전이 늘면 퍼센트로 전환하는 식의 유연성이 필요했다. 또한 특정 시즌이나 이벤트 기간에는 수수료를 임시로 조정하는 경우도 있으니, 매번 코드를 건드리지 않고 UI에서 값만 입력해서 적용할 수 있게 만드는 게 핵심이었다.

API와 UI의 역할 분담

웹 컨트롤러 클래스에는 충전 취소 요청을 받고, 환불 수수료 파라미터를 검증한 후 비즈니스 로직에 전달하는 엔드포인트를 추가했다. 단순히 "취소하세요"가 아니라 "이 취소에는 수수료를 얼마로 적용해"라는 정보까지 함께 받을 수 있도록 설계했다.

POST /charge/cancel
{
  "chargeId": 12345,
  "refundFeeType": "PERCENT",  // 또는 "AMOUNT"
  "refundFeeValue": 5.0        // PERCENT면 5%, AMOUNT면 5000원
}

detail.jsp에는 운영자가 직접 환불 수수료를 입력할 수 있는 폼을 추가했다. 라디오 버튼이나 선택지로 "퍼센트" 또는 "정액" 중 하나를 고르고, 그에 따른 숫자값을 입력하는 방식이다. 이 과정에서 입력값 유효성 검사(음수 방지, 범위 체크 등)도 클라이언트와 서버 양쪽에서 처리해야 했다.

이 작업에서 배운 운영성 설계

환불 같은 기능은 단순히 "기술적으로 가능한가"를 넘어, "운영팀이 얼마나 쉽게 관리할 수 있는가"까지 고려해야 한다. 초반엔 수수료를 하드코딩하고 싶은 유혹이 있었다. 간단하니까. 하지만 그러면 정책이 바뀔 때마다 배포를 해야 한다. 이건 위험하고 느리다.

그래서 환불 수수료를 UI에서 실시간으로 입력 가능하게 만들되, 개별 취소마다 다른 값을 쓸 수 있도록 열어뒀다. 평소에는 기본값을 쓰고, 특수한 케이스(예: VIP 고객 환불)에서는 그 자리에서 수수료를 조정하는 식의 유연성이 생겼다.

또한 이런 기능을 추가할 때는 "감사(audit) 기록"이 함께 가야 한다는 걸 느꼈다. 누가, 언제, 어떤 수수료로 충전을 취소했는지 남아야 나중에 분쟁이나 감사에서 근거를 댈 수 있다. 이번 작업에선 엔드포인트만 열었지만, 다음엔 로깅 레이어를 강화해야겠다는 게 다음 과제다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.