결제 폼 테스트 체크리스트가 필요한 이유는 단순합니다. 결제 화면은 대부분의 시간 동안 정상 동작하고, 문제는 나머지 시간에 터집니다. 네트워크가 끊기고, 카드가 거절되고, 사용자가 새로고침을 누르고, 인증 화면에서 창을 닫습니다. 이 글은 출시 전에 확인해야 할 항목을 순서대로 모은 목록이며, 각 항목이 실패했을 때 사용자에게 어떤 일이 생기는지도 함께 적었습니다.
입력 단계에서 확인할 것
- 빈 값, 한 자리 값, 최대 길이를 넘긴 값을 각각 넣어 보기
- 공백과 하이픈이 섞인 값을 붙여넣어 보기
- 숫자가 아닌 문자를 넣어 보고 오류 문구가 정확한지 보기
- 카드 조직을 바꿔 가며 안내 문구와 보안 코드 길이가 함께 바뀌는지 보기
- 만료된 카드와 이번 달 카드를 각각 넣어 보기
- 자동 완성이 엉뚱한 값을 채우지 않는지 보기
입력 단계의 목적은 사용자가 스스로 고칠 수 있게 만드는 것입니다. 무엇이 잘못되었는지 알 수 없는 오류 문구는 결제 포기로 이어집니다.
실패했을 때 사용자에게 무엇을 보여 줄까?
실패는 화면에서 가장 자주 어긋나는 순간입니다. 결제가 끝나지 않았다는 사실과 다시 시도해도 되는지를 함께 알려 주어야 사용자가 다음 행동을 정할 수 있습니다.
- 결제가 실제로 성립했는지 알 수 없는 상태를 별도로 두고, 그 상태의 문구를 정해 두기
- 재시도가 가능한 실패인지 아닌지를 구분해 버튼을 다르게 보여 주기
- 실패 화면에서 장바구니와 입력값을 보존해 처음부터 다시 입력하지 않게 하기
- 오류 문구에 카드 정보 일부를 되비추지 않기
- 같은 실패가 반복될 때 다른 결제 수단을 자연스럽게 권하기
두 번째 항목이 특히 자주 빠집니다. 재시도해도 결과가 달라지지 않는 실패에 재시도 버튼을 강조하면, 사용자는 같은 화면을 여러 번 왕복한 끝에 결제를 포기합니다.
거절은 어떻게 처리되는가?
거절은 사유에 따라 사용자가 해야 할 일이 다릅니다. 사유를 구분하지 않고 같은 문구를 보여 주면, 카드를 바꿔야 하는 사람에게 다시 입력하라고 안내하게 됩니다.
| 거절 사유 | 사용자가 할 수 있는 일 | 화면이 해야 할 일 |
|---|---|---|
| 잔액 부족 | 다른 카드 사용 | 다른 수단을 권하기 |
| 한도 초과 | 한도 확인 또는 다른 카드 | 재시도 안내하기 |
| 유효기간 오류 | 카드 정보 수정 | 해당 입력 칸을 가리키기 |
| 보안 코드 오류 | 카드 정보 수정 | 해당 입력 칸을 가리키기 |
| 카드 정지 | 발급사 문의 | 재시도를 권하지 않기 |
마지막 줄이 중요합니다. 다시 시도해도 결과가 달라지지 않는 거절에 재시도 버튼을 강조하면 사용자만 헤매게 됩니다.
재시도와 중복 결제를 어떻게 다룰까?
네트워크가 끊겼을 때 사용자는 같은 버튼을 다시 누릅니다. 이때 같은 결제가 두 번 만들어지면 큰 문제가 됩니다. 그래서 재시도 항목에는 반드시 중복 방지가 함께 들어가야 합니다.
- 요청이 시간 초과로 끝났을 때 화면이 무엇을 보여 주는지
- 사용자가 새로고침을 누른 뒤 같은 결제가 다시 만들어지지 않는지
- 뒤로 가기로 돌아와 다시 제출해도 중복이 생기지 않는지
- 재시도 사이에 같은 주문 식별자가 유지되는지
- 응답이 늦게 도착했을 때 화면 상태가 뒤집히지 않는지
이 항목들은 눈으로 확인하기 어렵습니다. 주문 목록을 함께 열어 두고 개수가 늘어나는지 보는 방법이 가장 확실합니다.
인증과 취소 흐름은 어떻게 되는가?
인증 화면은 우리 화면이 아닌 곳에서 열립니다. 그래서 흐름이 끊기는 지점이 여러 곳 생깁니다.
- 인증을 마치고 돌아왔을 때 주문이 완료로 정리되는지
- 인증을 취소했을 때 주문이 미결 상태로 남지 않는지
- 인증 창을 닫아 버렸을 때 어떻게 정리되는지
- 인증 도중 세션이 만료되었을 때 안내가 나오는지
미결 상태로 남은 주문은 나중에 정산과 대조할 때 문제를 일으킵니다. 정리 기준을 미리 정해 두어야 합니다.
환불과 취소는 시험했는가?
결제 성공만 확인하고 끝내면 환불 단계에서 문제를 만납니다. 결제의 모든 상태 전이를 한 바퀴 돌려 보는 것이 좋습니다.
- 전액 환불과 부분 환불이 각각 가능한지
- 환불 후 주문 상태와 잔액 표시가 맞는지
- 같은 결제에 환불을 두 번 요청하면 어떻게 되는지
- 환불 실패 시 사용자에게 무엇을 안내하는지
- 결제와 환불의 기록이 같은 주문으로 묶여 있는지
개발자를 위한 메모: 상태와 식별자를 표로 고정하라
결제는 상태 기계입니다. 상태와 전이를 표로 적어 두고, 표의 각 칸에 대해 테스트를 하나씩 두는 방식이 가장 빠릅니다.
- 상태 목록: 시작, 인증 대기, 승인 완료, 거절, 취소, 환불 완료
- 각 상태에서 허용되는 다음 상태를 정하고, 그 밖의 전이는 거부하기
- 같은 요청이 두 번 도착해도 결과가 같도록 요청 식별자를 두기
- 시간 초과 뒤 재시도가 새 결제를 만들지 않는지 확인하기
- 실패한 결제가 목록에 남는 방식과 정리 주기를 정하기
멱등성은 결제에서 특히 중요합니다. 같은 요청이 여러 번 도착해도 한 번만 처리되도록 요청 식별자를 발급하고, 서버가 그 값을 기준으로 중복을 걸러야 합니다. 이 부분은 결제 대행사 연동 문서에 별도 항목으로 정리되어 있으니 함께 확인하는 것이 좋습니다.
다음 단계
이 목록에서 아직 확인하지 않은 항목을 골라 하나씩 지워 나가세요. 특히 재시도와 중복 결제, 인증 취소 뒤 정리 세 가지는 실제 사고로 이어지기 쉬우므로 먼저 확인하는 편이 좋습니다. 입력 검증 쪽을 더 다듬고 싶다면 코드로 카드 번호 검증하기를, 카드사별 경계값이 필요하면 카드사별 테스트 카드 번호를 참고하세요. 생성기에서 만든 번호는 구조적으로 유효하지만 실제로 발급된 적이 없으므로, 테스트 전용으로만 사용해야 합니다.