CHALLENGE
클라이언트는 회원과 일반 고객에게 다른 가격을 적용하는 매장을 운영하면서, 키오스크에서도 할인 정책을 일관되게 적용할 필요가 있었습니다. 결제 직전에야 할인 금액을 보여주면 고객은 가격이 왜 달라졌는지 알기 어렵고, 회원 인증에 실패할 때 주문을 처음부터 다시 시작하면 작은 장애가 이탈로 이어졌습니다.
클라이언트가 필요로 한 이유
클라이언트의 핵심 요구는 할인 배지 자체가 아니라 가격 판정의 일관성이었습니다. 회원 상태, 상품 범위, 정책 유효 기간, 할인 상한, 결제 시점이 모두 맞아야 하며, 어느 하나가 달라지면 최종 금액도 달라집니다. 이 판단이 키오스크와 운영자 화면에 따로 구현되면 같은 장바구니가 서로 다른 가격을 보여줄 수 있었습니다.
그래서 회원 확인을 주문 초기에 짧게 배치하고, 가격 판정은 하나의 규칙에서 수행하도록 설계했습니다. 인증이나 결제가 실패해도 장바구니와 계산 근거를 보존해 일반가로 계속하거나 다시 시도할 수 있게 했습니다. 고객에게는 할인 이유를 결제 전에 보여주고, 운영자에게는 같은 거래의 인증·정책·결제 사건을 시간순으로 남기는 것이 이 구조를 선택한 이유였습니다.
주문 시작 시 짧게 회원을 확인하고, 결제 전에 일반가·회원가·할인 근거·최종 결제액을 한 화면에서 검토하도록 설계했습니다.
| 운영 과제 | 시스템에서 다룬 방식 |
|---|---|
| 회원 확인 지연 | QR 또는 전화번호로 주문 초기에 상태 확인 |
| 할인 근거 불명확 | 상품별 일반가·회원가와 적용 규칙을 결제 전에 표시 |
| 인증 실패 시 주문 중단 | 일반가 주문으로 계속하거나 인증을 다시 시도하도록 분기 |
| 결제 실패 추적 어려움 | 승인·거절·재시도·환불 사건을 거래 이력에 저장 |
클라이언트 요청사항과 기획 방향
가격 할인 기능만 추가하면 현장 혼선이 남기 때문에, 회원 확인부터 할인 근거 확인과 결제 실패 복구까지 한 주문 흐름으로 묶었습니다.
| 클라이언트 요청 | 이렇게 기획한 이유 | 해결 방식 |
|---|---|---|
| 키오스크에서도 회원가를 일관되게 적용하고 싶다 | 상품·회원 상태·정책 기간을 따로 판정하면 채널마다 가격이 달라질 수 있음 | 주문 초기에 회원을 확인하고 같은 할인 규칙으로 상품별 가격 계산 |
| 고객이 할인 이유를 결제 전에 알게 하고 싶다 | 최종 금액만 바뀌면 중복 할인이나 미적용 문의를 설명하기 어려움 | 일반가·회원가·할인 금액·적용 정책을 결제 확인 단계에 함께 표시 |
| 인증이나 결제가 실패해도 주문을 잃지 않고 싶다 | 작은 장애마다 장바구니를 다시 만들게 하면 현장 이탈과 재결제가 늘어남 | 일반가 전환·인증 재시도·동일 주문 결제 재시도를 분리해 제공 |
SOLUTION
클라이언트의 가격 운영 기준이 고객 화면과 관리자 화면에서 달라지지 않도록, 키오스크와 운영 콘솔을 하나의 가격 정책과 거래 데이터 위에 구성했습니다. 키오스크는 필요한 최소 정보만 보여주고, 운영 콘솔은 회원·상품·할인 규칙·거래·가져오기 이력을 상세하게 관리합니다.
한 건의 주문이 처리되는 과정
고객은 주문을 시작할 때 QR을 찍거나 전화번호를 입력합니다. 시스템은 회원이 등록돼 있는지만 보는 것이 아니라 활성·정지·만료 상태와 적용 가능한 등급을 함께 확인합니다. 확인에 실패하면 주문을 막지 않고 다시 인증하거나 일반가로 계속할 수 있게 선택지를 보여줍니다.
예를 들어 장바구니 일반가가 42,800원이라면 각 상품을 할인 규칙과 대조합니다. 회원 상태, 매장, 상품, 시간대, 할인 상한을 모두 통과한 품목만 할인해 최종 결제액 36,700원을 계산합니다. 결제 전 화면에는 ‘일반가 42,800원 → 회원 할인 6,100원 → 결제액 36,700원’과 적용 이유를 함께 보여줍니다. 고객이 금액 변화를 확인한 뒤에만 결제 요청을 보냅니다.
결제가 거절돼도 장바구니를 지우지 않습니다. 같은 주문에 결제 시도 결과를 추가하고 고객은 다른 결제 수단으로 다시 시도합니다. 재시도 사이에 재고나 가격이 달라졌다면 바뀐 품목만 알려주고 다시 확인받습니다. 운영자는 거래 상세에서 최초 장바구니, 적용 정책, 승인·거절, 재고 변경을 시간순으로 확인할 수 있습니다.
시스템 흐름
전화번호는 키오스크 응답에서 마스킹하고, 할인 규칙은 상품 가격과 분리했습니다. 규칙이 바뀌어도 과거 거래의 적용 금액과 근거는 그대로 남습니다.
회원가 판정 규칙
가격은 확률 점수로 추정하지 않고, 순서가 고정된 규칙으로 판정합니다. 네 개의 필수 조건을 모두 통과한 뒤에만 할인 금액을 계산합니다.
| 판정 순서 | 통과 조건 | 실패 시 처리 |
|---|---|---|
| 1. 본인 확인 | QR 또는 전화번호가 한 회원과 일치 | 재시도 또는 일반가 계속 |
| 2. 회원 상태 | 활성 상태이며 만료일 이내 | 할인 미적용, 사유 표시 |
| 3. 정책 범위 | 매장·상품·등급·시간 조건 일치 | 다음 우선순위 정책 확인 |
| 4. 금액 제한 | 품목·주문별 할인 상한 이내 | 상한까지만 적용 |
여러 정책이 겹치면 우선순위가 높은 활성 정책을 선택하고, 같은 우선순위에서는 고객에게 유리한 할인액을 사용합니다. 거래가 생성되는 순간 정책 ID, 정가, 할인액, 최종가를 품목 스냅샷으로 저장해 이후 정책이 바뀌어도 과거 영수증이 달라지지 않습니다.
진한 선은 일반가 합계, 밝은 선은 회원 판정 뒤의 결제액입니다. 가격이 조용히 바뀌지 않도록 정책 적용 단계에서 할인 근거를 노출하고, 고객이 최종 금액을 확인한 뒤에만 결제로 이동합니다.
결제 실행 조건
결제 요청은 장바구니 품목 재고 확인, 가격 스냅샷 생성, 고객 최종 확인이라는 세 단계를 통과해야 합니다. 거절 응답이 오면 새 거래를 무조건 만들지 않고 같은 주문의 시도 이력에 결과를 추가합니다. 재고가 달라졌다면 바뀐 품목만 알려주고 재확인을 받습니다.
고객 키오스크
- QR·전화번호 회원 확인과 상태별 안내
- 상품 검색, 장바구니, 수량 변경
- 일반가·회원가·할인 금액·최종 결제액 비교
- 결제 승인·거절과 동일 주문 재시도
- 회원 확인 없이 일반가로 계속하는 안전한 대체 흐름
운영 콘솔
- 회원·상품·할인 규칙·거래의 전체 검색과 25·50건 페이지 이동
- 회원 등록과 상태 변경, 상품 가격·재고 수정
- 할인 규칙 생성과 활성 상태 관리
- CSV 가져오기 결과와 오류 행 격리
- 인증·거래·가격·재고·감사 사건 타임라인
BUILD
회원 상태, 상품, 할인 규칙, 거래, 거래 품목, 거래 사건, 인증 시도, CSV 배치, 상태 이력을 관계형 운영 데이터로 분리했습니다. 정상 결제뿐 아니라 인증 장애, 결제 거절, 부분·전액 환불, 저재고와 복구 상태까지 서버에서 발생해 동일한 감사 이력에 기록됩니다.
데이터를 가격으로 푸는 방식
키오스크는 원본 회원 정보를 직접 받지 않고 마스킹된 상태와 판정 토큰만 사용합니다. 서버는 장바구니의 각 품목을 활성 정책과 대조해 적용 근거 배열을 만들고, 합계와 함께 반환합니다. 결제 완료 뒤에는 원래 장바구니, 적용 정책, 결제 시도, 재고 변화를 하나의 거래 ID로 묶어 운영자가 끝까지 추적할 수 있게 했습니다.
검증한 데이터 규모
| 데이터 | 규모 |
|---|---|
| 회원 / 상품 / 할인 규칙 | 1,600 / 200 / 120 |
| 거래 / 거래 품목 | 12,800 / 34,501 |
| 거래 사건 | 25,879 |
| 인증 시도 | 18,000 |
| CSV 배치 / 행 상세 | 104 / 9,360 |
| 회원 상태 이력 | 1,707 |
| 감사 로그 | 4,800 |
VALIDATION
- 자동 테스트 4건 통과
- 프로덕션 빌드 완료
- 회원 확인·회원가 계산·결제 승인과 거절·재시도 흐름 확인
- 정책 겹침, 만료 회원, 할인 상한의 판정 근거 확인
- 운영 콘솔 2페이지 이후 검색·상세·수정 확인
- 상태 변화의 데이터베이스 저장과 새로고침 지속성 확인
- 데스크톱·태블릿·모바일에서 콘솔 오류와 예상 밖 오류 응답 없음
RESULT
| 주문 장면 | 기존에 생기던 문제 | 구축 후 처리 방식 |
|---|---|---|
| 회원 확인 | 결제 직전에 자격을 확인해 가격 변경을 뒤늦게 알림 | 주문 시작 시 상태를 확인하고 일반가 계속 흐름도 제공 |
| 할인 계산 | 키오스크와 운영 화면이 서로 다른 규칙을 적용할 위험 | 하나의 정책 엔진에서 상품별 할인 근거와 최종가 계산 |
| 결제 실패 | 인증이나 결제가 실패하면 장바구니부터 다시 구성 | 같은 주문에 시도 이력을 추가하고 장바구니와 가격 근거를 보존 |
회원 1,600명, 거래 12,800건, 인증 시도 18,000건을 이용해 등급 겹침, 만료, 결제 거절, 환불과 재고 변경이 함께 발생해도 과거 거래 금액이 바뀌지 않는지 확인했습니다.
비슷한 업무에 적용할 수 있는 부분
회원 등급가, 임직원 할인, 거래처별 공급가처럼 자격에 따라 가격이 달라지는 주문이 같은 설계 대상입니다. 고객에게는 가격이 달라진 이유를 보여주고, 운영자에게는 당시 적용된 정책을 남겨야 합니다.
본 프로젝트는 고객사 실제 업무 요건을 바탕으로 설계한 결과물이며, 보안 정책에 따라 일부 화면만 공개했습니다.



