Backend & Distributed Systems
충돌을 감지하는 멱등 세션 저장 API
응답 유실 뒤에도 중복 없이 재시도하고 의미가 달라진 요청은 충돌로 차단하는 세션 저장 API 설계를 설명합니다.
클라이언트는 타임아웃 난 쓰기가 서버에 도착하지 않았는지, 저장은 됐지만 응답만 잃었는지 알 수 없다. 일반 POST를 다시 보내면 같은 학습 세션이 두 번 기록될 수 있다. 이 구현은 타이머를 시작할 때 한 번 만든 요청 ID를 서버 확인이 끝날 때까지 유지한다.
ID는 네트워크 시도가 아니라 사용자 행동에 속한다
재시도마다 UUID를 새로 만들면 멱등성이 사라진다. ID는 논리적 세션을 나타내고 실행 중인 타이머와 함께 저장돼야 한다. 데이터베이스 기본키가 최종 원자적 중복 방지선이 된다. 사전 조회만으로는 동시 요청 사이 경쟁을 막을 수 없다.
저장된 영역, 단위, 결과, 시간이 같으면 기존 행을 성공으로 반환한다. 같은 ID로 다른 학습이나 결과가 오면 409 Conflict를 반환한다. 첫 기록을 덮어쓰면 감사 이력이 깨지고, 변경된 의미를 조용히 받아들이면 클라이언트 오류가 감춰진다.
회귀 테스트는 최초 저장, 동일 재시도, 다른 학습에 같은 ID 재사용을 검사했다. 로컬 D1 종단간 시험에서도 동일 재시도 뒤 행이 하나만 남고 충돌 요청은 거부됐다. 다중 리전에서 전역 순서를 보장하려면 별도의 일관성 설계가 필요하다는 한계도 남는다.
관련 글
Backend & Distributed Systems
용량 제한과 잠금을 갖춘 주간 계획 API
마감을 보호하고 주간 시간과 하루 항목 수를 제한하며 승인한 계획을 잠그는 결정론적 주간 계획 API입니다.
Backend & Distributed Systems
삭제 후 재생성을 막는 툼스톤 설계
사용자가 삭제한 기본 항목을 영구 삭제하면서 앱 초기화 로직이 같은 항목을 되살리지 못하게 하는 데이터 설계입니다.
Backend & Distributed Systems
Backend API와 데이터 시스템 설계 기초
Spring 회원 관리 예제, MVC, DB 접근, SQL, NoSQL, 캐시를 백엔드 시스템 설계 흐름으로 정리합니다.