Skip to content

Fix: 과제 중복 문제#94

Merged
tember8003 merged 2 commits intodevfrom
fix/AssignmentDuplicate
Apr 8, 2026
Merged

Fix: 과제 중복 문제#94
tember8003 merged 2 commits intodevfrom
fix/AssignmentDuplicate

Conversation

@tember8003
Copy link
Copy Markdown
Collaborator

@tember8003 tember8003 commented Apr 8, 2026

Fix: 과제 중복 제출 - 비관적 락

DB 단에서 하지 않고 일단 비관적 락을 적용해 해결하는 방향으로 잡았습니다
CTF때보다는 간단하게 코드를 짠 거 같은데 운영 단계에서 잘 되길 빕니다...
image

문제

  • 동일 사용자가 같은 Plan에 과제를 동시에 여러 번 요청할 경우, 중복 체크(validateDuplicateSubmission)를 통과한 두 요청이 모두 save까지 도달해 과제가 중복 저장될 수 있었습니다.

해결 방법

  • submitAssignment 내에서 중복 체크 직전에 Plan 행에 비관적 쓰기 락(PESSIMISTIC_WRITE)을 획득해 동시 요청을 직렬화합니다.

변경 사항

PlanRepository

  • @Lock(LockModeType.PESSIMISTIC_WRITE) 적용한 findByIdWithPessimisticLock 쿼리 추가

AssignmentSubmissionService

  • PlanRepository 의존성 추가
  • submitAssignment에서 락 획득 → 중복 체크 순서로 호출
  • getSubmissionStatistics의 제출 수 집계를 변경 (혹시 중복이 생겼을 때도 인원 수가 정확히 반영되도록 수정)

테스트

  • AssignmentSubmissionServiceTest: 락 획득 순서 보장, 락 실패 시 후속 단계 미실행, 중복 차단 검증
  • AssignmentSubmissionConcurrencyTest: 동시 5개 요청 중 1개만 성공하는 것 검증

Copy link
Copy Markdown
Collaborator

@minsoo0506 minsoo0506 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했어용:) redis 안쓰고 db 비관적 락을 사용했군요. 트랜잭션 점유시간이 길긴하지만 CTF처럼 충돌이 극심한 상태가 아니니 괜찮을 것 같습니다. 고생했어요 😎

@tember8003 tember8003 merged commit 89a6acf into dev Apr 8, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants