대량 동시 요청 환경에서 쿠폰 발급 수량 정합성과 중복 발급을 보장하기 위한 DB 기반 동시성 제어 적용


1. 문제 정의

선착순 쿠폰 발급 API는 단순히 쿠폰을 조회하고 발급 이력을 저장하는 CRUD 기능이 아니다. 동시에 많은 사용자가 같은 쿠폰을 요청할 수 있기 때문에 다음 정합성을 반드시 보장해야 한다.

  1. 전체 발급 수량은 쿠폰 재고를 초과하면 안 된다.
  2. 동일 사용자는 같은 쿠폰을 중복 발급받으면 안 된다.
  3. 발급 수량 증가와 발급 이력 저장은 하나의 일관된 흐름으로 처리되어야 한다.

이번 작업에서는 동시성 테스트를 통해 문제를 재현하고, DB의 atomic update, unique constraint, pessimistic lock까지 단계적으로 구현·검토해 정합성을 개선했다.


2. 발생한 문제

2.1 문제 1: 발급 수량 초과

초기 방식에서는 쿠폰을 조회한 뒤 현재 발급 수량을 확인하고, 발급 가능하면 수량을 증가시키는 흐름이었다.

쿠폰 조회
→ issuedQuantity 확인
→ totalQuantity와 비교
→ 발급 이력 저장
→ issuedQuantity 증가

하지만 동시에 많은 요청이 들어오면 여러 트랜잭션이 같은 issuedQuantity 값을 읽고 각각 발급을 진행할 수 있다.

예상 결과는 다음과 같다.

totalQuantity = 100
동시 요청 수 = 1,000
발급 성공 수 = 100
DB 저장 수 = 100

하지만 동시성 제어가 없으면 실제 발급 수량이 재고보다 많아질 수 있다.


2.2 문제 2: 동일 사용자 중복 발급