### 🔍 개요 - 상위 기능 이슈: #2335 - 기준: `origin/develop@2bbb2a23ca04fc7ece8a2986f12e88f12a4ab92e` - 심각도: **P2 검증 공백 (회귀 시 P1 서비스 데이터 오류)** - 분류: **서버 내부 동시성 / 클라이언트 계약 변경 없음** ROLE_BASED HTTP 여정과 실제 MySQL 동시성 검증을 한 PR에 넣으면 리뷰가 어려우므로, 이 이슈는 동시성 불변식에만 한정합니다. ROLE_BASED HTTP 여정은 #2402/#2406으로 분리합니다. ### 문제 시나리오 1. 같은 사용자가 거의 동시에 두 번 지원합니다. 2. 또는 남은 한 자리에 대해 팀장이 두 지원자를 동시에 승인합니다. 3. 락이나 트랜잭션 회귀가 생기면 중복 지원 또는 정원 초과가 발생할 수 있습니다. ### 기대 동작 - 동시 중복 지원은 한 건만 성공하고 다른 한 건은 `TEAM_RECRUITMENT_APPLICATION_DUPLICATE`로 끝납니다. - 마지막 자리 동시 승인은 한 명만 `ACCEPTED`, 다른 한 명은 `REJECTED`가 됩니다. - TEAM 멤버, 알림, outbox가 성공한 결과와 정확히 연결되고 중복되지 않습니다. ### 📱 클라이언트 영향 요청·응답 형식은 바뀌지 않습니다. 실제 서비스에서 중복 탭이나 동시 승인 때문에 화면 상태와 서버 데이터가 어긋나는 것을 막는 서버 회귀 테스트입니다. ### ✅ 완료 조건 - 실제 MySQL과 service transaction 경계에서 두 동시성 시나리오가 통과합니다. - 지원, 정원, TEAM 멤버, 알림, outbox의 최종 개수와 연결 값을 검증합니다. - production 코드는 변경하지 않습니다. ### 🚫 범위 밖 - ROLE_BASED 전체 HTTP 여정: #2402/#2406 - 실제 외부 FCM 발송
🔍 개요
origin/develop@2bbb2a23ca04fc7ece8a2986f12e88f12a4ab92eROLE_BASED HTTP 여정과 실제 MySQL 동시성 검증을 한 PR에 넣으면 리뷰가 어려우므로, 이 이슈는 동시성 불변식에만 한정합니다. ROLE_BASED HTTP 여정은 #2402/#2406으로 분리합니다.
문제 시나리오
기대 동작
TEAM_RECRUITMENT_APPLICATION_DUPLICATE로 끝납니다.ACCEPTED, 다른 한 명은REJECTED가 됩니다.📱 클라이언트 영향
요청·응답 형식은 바뀌지 않습니다. 실제 서비스에서 중복 탭이나 동시 승인 때문에 화면 상태와 서버 데이터가 어긋나는 것을 막는 서버 회귀 테스트입니다.
✅ 완료 조건
🚫 범위 밖