#Backend

고객의 취소할 권리를 보장하다

고객의 취소할 권리를 보장하다
01

Summary

“상품이 아직 선반 위에 있는데 취소가 안 된다고요?” 올리브영이 고객의 '취소할 권리'를 위해 백엔드를 개편한 이야기

조건문 수정으로 시작해 Kafka 파이프라인, Redis 분산 락, 장애 격리까지 해결한 실시간 주문 취소 엔지니어링

올리브영 주문·배송 도메인에서 고객의 불만이었던 '배송준비중 취소 불가' 문제를 해결하기 위해 취소 마감 시점을 실물 출고 직전까지 늦춘 기술적 여정을 소개합니다. 배송유형별로 복잡하게 꼬여 있던 판별 조건들을 하나의 시점 지표로 통합하고, 비동기 이벤트 파이프라인과 분산 락을 통해 실시간 데이터 무결성을 성공적으로 구축한 아키텍처 설계 과정을 다룹니다.

  • 01센터배송, 업체배송, 오늘드림 등 배송유형에 맞춰 가장 합리적인 취소 마감 골든타임을 물리적 최종 단계로 세분화하여 확보
  • 02마이페이지, 백오피스, 배치 시스템 등 사방에 파편화되어 있던 취소 로직을 '취소 불가 일시'라는 필드 단 하나로 과감히 단일화
  • 03Kafka를 활용해 물류 시스템으로부터 신규 '피킹 실적 완료' 이벤트를 실시간으로 전달받는 비동기 이벤트 중심의 결합도 완화
  • 04이벤트 누락으로 인한 선박 출발 후 취소 사고를 방지하기 위해 출고 확정 이벤트를 이중 가드라인으로 설정하는 정합성 설계
  • 05오늘드림 배송의 수동 배차 요청과 고객 취소가 수 밀리초 차이로 동시 발생할 때 생기는 데이터 레이스 컨디션을 Redis 분산 락으로 정밀 통제

RECOMMENDATION

배송, 결제, 예매 등 물리적인 실물 트랜잭션 흐름과 사용자 인터페이스 상태의 실시간 싱크를 고도화해야 하는 서비스 백엔드 개발자분들께 적극 권장합니다. 외부 연동 시스템과의 동시성 문제를 분산 락과 비동기 이벤트를 통해 우아하게 격리·해결하는 실전 패러다임을 습득할 수 있습니다.

The Problem

기존 올리브영 주문 배송 시스템은 물류센터의 출하 지시(작업 할당) 시점부터 주문 취소를 차단했기 때문에, 실제 상품이 출고되기 전 단계(피킹 중 등)에 있어도 고객이 직접 앱에서 취소하지 못하고 CS 문의나 반품 프로세스를 거쳐야 하는 불편함이 존재했습니다.

The Solution

배송 유형별로 물리적으로 취소를 되돌릴 수 없는 최종 시점(센터배송: 피킹 완료, 업체배송: 송장 등록, 오늘드림: 배차)을 새롭게 정의하고, 이를 단일 시점 필드인 '취소 불가 일시'로 일원화해 처리했습니다. 또한, 물류 시스템으로부터 신규 피킹 실적 이벤트를 Kafka로 구독하여 상태를 업데이트하고, 배차 요청과 취소가 동시에 겹쳐 발생하는 경쟁 상황은 Redis 분산 락을 도입해 제어했습니다.

The Result

고객이 복잡한 절차 없이 앱에서 클릭 한 번으로 간편하게 주문을 즉시 취소할 수 있는 주도권을 확보했습니다. 취소 불가 여부를 단 하나의 조건 값으로 판단하게 하여 분산된 로직을 깔끔하게 통합했으며, 오늘드림 배차가 취소되는 등 예외 시 다시 취소 가능 상태로 안전하게 되돌리는 유연성도 확보했습니다.

Trade-off

고객의 '즉시 취소 확정'을 보장하는 구조적 선택으로 인해 시스템 정합성의 모든 책임을 백엔드가 안게 되었습니다. 만약 피킹 완료 이벤트가 비정상적으로 누락되거나 지연되어 들어오는 극히 드문 골든타임의 틈새 기간 동안 실물은 이미 포장되어 나가고 정산과 배차가 꼬일 수 있어, 모니터링 추적 및 출고 확정 시에도 상태를 2중으로 잠그는 방어적 보완책과 수동 보정 비용이 수반됩니다.

03

Key Concepts

Concept · 01

취소 불가 일시 (Unified Cancel Limitation Flag)

서로 다른 비즈니스 영역에서 제각각 참조하던 취소 가능 상태의 판별 분기 규칙들을 단 하나의 일시 필드로 단순화한 상태 제어 모델입니다.

  • 해당 필드가 비어 있으면 취소 가능, 세팅되어 있으면 취소 불가능의 이분법 구조로 극도의 로직 단순화를 완성함
  • 배달 대행사 취소 등의 콜백이 오는 예외 발생 시 필드를 다시 비우기만 하면 즉시 취소 가능 상태로 회복시킬 수 있음
Concept · 02

이벤트 기반 비동기 파이프라인 (Event-Driven Pipeline)

시스템 간 강한 종속성을 제거하기 위해 특정 업무가 종료된 시점에 발행하는 실시간 비동기 이벤트를 통해 데이터를 연동하는 아키텍처 패턴입니다.

  • 물류 시스템이 발송하는 피킹 실적 Kafka 이벤트를 배송 시스템 컨슈머가 실시간으로 수신해 정합성을 마킹함
  • 호출 API를 새로 엮거나 복잡하게 동기 연결하지 않아 시스템 장애 전파 리스크를 최소화함
Concept · 03

Redis 분산 락 (Redis Distributed Lock)

여러 애플리케이션 인스턴스 환경에서 동일한 자원에 동시 쓰기 요청이 가해질 때 고유한 Key값을 활용해 상호 배제(Mutual Exclusion)를 보장하는 동시성 제어 기법입니다.

  • 고객의 주문 취소 요청과 매장의 O2O 배차 요청이 거의 동시에 도착하는 race condition 상황의 무결성을 지키기 위해 사용됨
  • 락 점유 시 DB 커넥션을 오래 잡고 있는 비관적 락이나, 롤백 처리가 불가능한 낙관적 락의 한계를 주문번호 단위의 가벼운 Redis 분산 락으로 대체 해결함