Skip to content

feat: S3 upload detected 엔드포인트 추가 및 Lambda invoke 멱등성 보강#27

Merged
ThinkKat merged 2 commits intomainfrom
dev
Mar 3, 2026
Merged

feat: S3 upload detected 엔드포인트 추가 및 Lambda invoke 멱등성 보강#27
ThinkKat merged 2 commits intomainfrom
dev

Conversation

@ThinkKat
Copy link
Copy Markdown
Owner

@ThinkKat ThinkKat commented Mar 3, 2026

Summary

  • POST /api/v1/answers/internal/s3-upload-detectedPOST /api/v1/drill-answers/internal/s3-upload-detected 엔드포인트 추가
  • completeAnswerUpload / submitDrillAnswerSELECT FOR UPDATE + isFeedbackNone() 게이트 적용 — 두 경로가 동시에 도달해도 Lambda invoke 1회만 발생
  • 멱등성 단위 테스트 추가 (AnswerIdempotencyTest, DrillAnswerIdempotencyTest)

Changes

  • S3UploadDetectedRequest.java DTO 신규
  • AnswerRepository / DrillAnswerRepositoryfindByIdForUpdate(), findByAudioUrlForUpdate() (PESSIMISTIC_WRITE) 추가
  • AnswerService.handleS3UploadDetected() / DrillAnswerService.handleS3UploadDetected() 신규 구현
  • AnswerController / DrillAnswerController/internal/s3-upload-detected 엔드포인트 추가

Test plan

  • AnswerIdempotencyTest — completeUpload 선행 / s3Detected 선행 / FREE 유저 3 시나리오 통과 확인
  • DrillAnswerIdempotencyTest — 동일 3 시나리오 통과 확인
  • POST /api/v1/answers/internal/s3-upload-detected 직접 호출 → PENDING Answer가 SUCCESS로 변경되고 Lambda invoke 로그 확인
  • 동일 fileKey로 두 번 호출 → 두 번째에서 feedback_already_requested 로그만 남고 Lambda 미호출 확인

ThinkKat added 2 commits March 3, 2026 15:36
- POST /api/v1/answers/internal/s3-upload-detected 추가
- POST /api/v1/drill-answers/internal/s3-upload-detected 추가
- AnswerService.handleS3UploadDetected() / DrillAnswerService.handleS3UploadDetected() 구현
  - SELECT FOR UPDATE + isFeedbackNone() 체크로 Lambda 중복 invoke 방지
- completeAnswerUpload / submitDrillAnswer 멱등성 보강
  - findByIdForUpdate() 적용, isFeedbackNone() 기준으로 Lambda invoke 여부 결정
- AnswerRepository / DrillAnswerRepository에 findByIdForUpdate(), findByAudioUrlForUpdate() 추가
completeAnswerUpload/submitDrillAnswer와 handleS3UploadDetected가 순서에
관계없이 두 번 실행됐을 때 Lambda invoke가 1회만 발생하는지 검증.

핵심: 두 Mock이 동일한 Answer 엔티티 객체를 반환하므로 첫 번째 호출의
requestFeedback() 상태 변경이 두 번째 호출의 isFeedbackNone() 체크에 반영됨.

- AnswerIdempotencyTest: 세션 답변 3 시나리오
- DrillAnswerIdempotencyTest: 드릴 답변 3 시나리오
- AnswerServiceTest: findById → findByIdForUpdate 모킹 수정
@ThinkKat ThinkKat merged commit fa40c46 into main Mar 3, 2026
2 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.

1 participant