비회원 주문의 쿠폰 핀 발급 오류 수정
목차
비회원 주문에서 터진 핀 생성 버그
이커머스 백오피스에서 핀(쿠폰 코드) 생성 로직을 손봤음. 어드민 화면과 파트너 화면 양쪽에서 핀을 발급할 수 있는데, 비회원 주문이 끼면 회원 식별값이 없어서 다운스트림에서 NPE가 터지거나 매칭이 엉뚱하게 붙는 케이스가 있었음.
원래는 핀 생성 시 회원 식별값을 그대로 던지면 그만이었는데, 비회원 결제 비중이 늘면서 식별값이 null 인 채로 흘러들어가는 경로가 늘어났음. 이게 핀 유틸 내부의 매칭 로직과 만나면 "회원 = 0" 으로 강제 캐스팅되거나, 연락처 기반 매칭이 시도되지 않고 그대로 끊겨버림.
무엇이 문제였나
- 컨트롤러 두 개(어드민/파트너)에서 핀 유틸을 호출하는데, 한쪽은 비회원 분기 처리가 있고 한쪽은 없었음
- 핀 유틸 내부에서 식별값이 null 이면 "0" 으로 보정하던 레거시 로직이 남아 있었음. 이게 진짜 회원번호 0번이랑 충돌
- 연락처 매칭 유틸도 회원 식별값을 우선 보고, 없을 때만 연락처를 보는 구조라 비회원이면 매칭 자체가 스킵됨
| 케이스 | 기존 동작 | 기대 동작 |
|---|---|---|
| 회원 주문 | 식별값으로 매칭 | 동일 |
| 비회원 + 연락처 있음 | 매칭 스킵 | 연락처로 매칭 |
| 비회원 + 연락처 없음 | "0" 보정 → 충돌 | null 유지 + 게스트 표시 |
어떻게 고쳤나
식별값 보정 로직을 걷어내고, 비회원 여부를 명시적으로 들고 다니도록 바꿈. 핀 유틸과 연락처 매칭 유틸 모두 식별값이 null 일 수 있다는 전제로 다시 짰음.
isGuest = memberSn == null
if (isGuest) {
// 연락처 기반 매칭 → 없으면 게스트 핀으로 발급
} else {
// 기존 회원 매칭 흐름
}
- 컨트롤러 양쪽에서 비회원 판별 로직을 한 곳으로 모아 중복 제거
- 핀 발급 결과에 "게스트 발급" 플래그를 같이 내려서, 후속 알림/정산이 회원 발급과 분리되어 흐르도록 함
- 연락처 매칭은 우선순위를 식별값 → 연락처 → 미매칭 순으로 명시. 매칭 실패 시에도 핀은 발급되고 미매칭 큐로 빠짐
회고
작은 패치인데 손볼 곳이 4개 파일로 번진 이유는 결국 "비회원" 이라는 상태가 도메인에 1급 시민으로 자리잡지 못해서였음. 식별값 한 컬럼에 의미를 두 개(회원번호 + 비회원 여부) 태운 게 화근. 다음에 결제 플랫폼 쪽 모델 손볼 때는 게스트 주문을 별도 타입으로 분리하는 걸 우선순위에 넣어야겠음.
매칭 실패 핀이 미매칭 큐로 들어가는 흐름은 운영팀이 사후에 연락처로 붙일 수 있게 한 안전장치인데, 이번에 처음 살림. 비회원 주문이 늘어나는 추세라 이쪽 모니터링 지표도 같이 잡기로 함.
다음
댓글 0
첫 댓글 달아줘.