피드로 돌아가기
How to build a credit system for a Next.js AI app (Stripe + Supabase)
Dev.toDev.to
Backend

Postgres Row Lock과 Idempotency Key를 통한 무결성 보장 AI 크레딧 시스템 설계

How to build a credit system for a Next.js AI app (Stripe + Supabase)

Algernon2026년 6월 6일7intermediate

Context

AI 서비스의 높은 API 비용으로 인한 고정 요금제의 한계를 극복하기 위해 사용량 기반 크레딧 시스템 도입이 필요함. 기존의 애플리케이션 레벨 잔액 검증 방식은 동시성 요청 시 Race Condition으로 인한 오버드로우(Overdraw) 및 중복 충전 문제를 야기함.

Technical Solution

  • DB 수준의 원자적 연산 수행를 위해 WHERE balance >= p_amount 조건을 포함한 단일 Update 문으로 Row Lock을 확보하여 Race Condition 원천 차단
  • credit_ledger 테이블에 idempotency_key Unique 제약 조건을 설정하여 Stripe Webhook의 At-least-once 전달로 인한 중복 충전 방지
  • 요청-처리-환불의 비동기 파이프라인 설계를 통해 모델 추론 중 타임아웃을 방지하고 작업 실패 시 자동 환불 로직 구현
  • FOR UPDATE SKIP LOCKED 구문을 활용한 Job Queue 설계로 다중 Worker 환경에서도 작업 중복 할당 없는 병렬 처리 구조 확보
  • 충전과 환불에 서로 다른 Idempotency Key 접두사를 부여하여 동일 작업 내에서의 충돌 없이 독립적인 트랜잭션 무결성 유지

- 잔액 검증 및 차감 로직을 애플리케이션 코드가 아닌 DB의 원자적 쿼리로 이동했는가 - 외부 결제 시스템의 Webhook 처리 시 이벤트 ID 기반의 Idempotency Key를 적용했는가 - 긴 실행 시간이 소요되는 AI 추론 과정을 비동기 Worker 구조로 분리하고 실패 시의 환불 시나리오를 설계했는가 - 분산 Worker 환경에서 작업 중복 수신을 방지하기 위한 DB 락 전략을 수립했는가

원문 읽기