개발을 하면서 외국 결제 시스템의 개발 트렌드나
요즘 개발 어떻게 하나.. 궁금해서 둘러보던 중 찾은 단어
"멱.등.성" 이라는 단어 자체가 생소하고 컴공인 나도 뭐라는 건지 모르겠는데 쉽게 정리해 보겠다.
결제 시스템 개발자라면 "아.. 뭐야 어려운 건 줄 알았는데 별거 아니네" 할 거임.
동일 요청이 여러 번 와도 한 번만 실행
⚠️ 핵심은 “요청 횟수”가 아니라 “결과의 중복 방지”
결제 시스템에서는 이런 일이 실제로 일어남
> 자, 이때 멱등성 없으면? <
❌ 돈 두 번 받음
❌ 권한 두 번 열림
❌ 데이터 꼬임
“이 요청은 이 거래다”를 식별하는 키
예시 :payment_id, order_id, transaction_id ...
payment_id = "2025121618000001A"
SELECT * FROM payments WHERE payment_id = '2025121618000001A';
@app.post("/webhook/payment")
def payment_webhook(req: PaymentWebhook):
if payment_exists(req.payment_id):
return {"status": "ok"} # 이미 처리됨
save_payment(req)
grant_access(req.user_id)
return {"status": "ok"}
단순한데 영속성 떄문임
- 이유 1️⃣ 메모리는 믿을 수 없음
서버 재시작
멀티 인스턴스
- 이유 2️⃣ 결제는 영속성 필요
감사 로그
분쟁 대응
트랜잭션 = DB에서 ‘한 덩어리’로 묶인 작업 단위
“모두 성공하거나 모두 실패해야 한다”는 특징
둘 다 성공 → commit
하나라도 실패 → rollback
원자성(Atomicity)을 보장하는 것
| 항목 | 트랜잭션 | 멱등성 |
|---|---|---|
| 목적 | 여러 작업 묶어서 “전부 성공 or 전부 실패” | 같은 요청이 여러 번 와도 “결과는 1번만 처리” |
| 범위 | 단일 DB/작업 단위 | 요청 단위 / 시스템 전체 |
| 구현 | DB 트랜잭션(commit/rollback) | DB 조회 + UNIQUE 제약 + 로직 분기 |
| 예시 | 계좌 송금, 주문 생성과 재고 차감 | 결제 Webhook 중복 수신 방지 |
멱등성만 있으면?
중복 요청은 막을 수 있음
하지만 DB 작업이 중간에 실패하면?
예: 결제 기록 저장 후 권한 부여 중 실패 → 데이터 불일치
트랜잭션만 있으면?
같은 요청 여러 번 오면?
PG Webhook 두 번 → 두 번 처리 → 돈 중복 차감
결론
멱등성: “중복 요청 거르는 관문”
트랜잭션: “한 요청 처리 단위를 안전하게 실행”