C.W.K.
Stream
Lesson 08 of 10 · published

DB 연산의 멱등성

~12 min · transactions, idempotency

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

네트워크 실패가 default

앱이 네트워크로 DB 호출할 때마다, 호출이 세 가지로 실패 가능: DB 가 보기 전에, 처리 후 응답 도착 전에, 또는 성공. 앱 관점에서, "응답 못 받음" 이 "요청 도착 안 함" 또는 "요청 성공했지만 못 들음" 과 동일. 너 retry 가 어느 쪽이든 안전해야.

멱등 연산

연산이 멱등 = 두 번 (또는 스무 번) 실행이 한 번 실행과 같은 효과. SELECT 가 멱등. SET status = 'paid' 가 멱등. SET balance = balance - 100아님. 자연스러워 보이는 많은 write 가 멱등 아님.

Write 멱등하게 만드는 패턴

  • Insert 에 ON CONFLICT DO NOTHING 또는 DO UPDATE.
  • 클라이언트에서 idempotency key 전달; 테이블에 insert; 중복 거절.
  • 가능하면 절대 update (SET balance = ?) 사용, delta (SET balance = balance - ?) 대신.
  • 적용된 연산을 사이드 테이블에 추적 → 재실행 감지.

Code

클라이언트 제공 idempotency key·sql
CREATE TABLE payments (
    id              UUID PRIMARY KEY,
    idempotency_key TEXT UNIQUE NOT NULL,
    amount          NUMERIC(10,2) NOT NULL,
    status          TEXT NOT NULL DEFAULT 'pending',
    created_at      TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 같은 키 두 번 → 두 번째 insert 조용히 스킵, 더블-차지 없음
INSERT INTO payments (id, idempotency_key, amount)
VALUES (gen_random_uuid(), :key, :amount)
ON CONFLICT (idempotency_key) DO NOTHING
RETURNING *;
WHERE 통한 멱등 UPDATE·sql
-- 이미 paid 아닐 때만 paid 표시; retry 안전
UPDATE invoices
SET status = 'paid', paid_at = now()
WHERE id = ? AND status <> 'paid';

External links

Exercise

프로젝트에서 비-멱등 write 감사 (delta-style update, 중복 가능한 plain INSERT). 최소 한 개를 멱등하게 재설계 — ON CONFLICT, idempotency key, 또는 status-guarded UPDATE.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.