[TIL-260722] 검증 재시도 API를 만들다 발견한 동시성 문제와 비관적 락으로 해결한 과정

·
Backend/DB
우리 서비스는 콘텐츠를 등록하면 백그라운드 비동기 워커가 AI 검증을 수행하고, 프론트엔드는 폴링(Polling)으로 검증 상태를 주기적으로 조회한다. 검증이 실패한 경우에는 사용자가 '재시도(Retry)' 버튼을 눌러 다시 검증을 요청할 수 있도록 API를 추가했다. 처음엔 단순한 API라고 생각했다. 기존 검증이 진행 중인지 확인하고, 아니라면 새로운 PENDING 이력을 만들고 검증 이벤트를 발행하면 끝이라고 생각했다. 그런데 구현을 마치고 다시 코드를 보니, 사용자가 버튼을 여러 번 누르는 순간 동시성 문제가 생길 수 있다는 걸 발견했다.1. 처음 구현은 이렇게 생겼다재시도 API의 역할은 단순하다.POST /api/contents/{contentId}/retry현재 검증이 진행 중인지 확인한다...