MSG-440 feat: 행사 영상 업로드와 위치별 피드·상세 추가 - #200
Merged
Merged
Conversation
|
Claude finished @s13121312's task in 2m 36s —— View job 리뷰 완료
확인 범위: 인라인 코멘트로 남길 결함은 없었습니다. 발견 사항:
|
테스트 커버리지
|
테스트 커버리지
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🎫 관련 티켓
작업 내용
POST /api/event-occurrences/{oid}/locations/{lid}/videos. 촬영과 갤러리 선택이 같은 계약 하나를 쓰고, 좌표·제목·설명을 받지 않으며 격자는 서버가 그 위치의 대표 격자로 지정합니다. 기존 업로드 확정 코어를 그대로 타서 점령·뱃지·스트릭·핫스코어까지 일반 업로드와 동일하게 처리하고(미션 판정만 제외), 같은 트랜잭션에event_videos연결 한 행을 더합니다.s3Key이고, 별도 컬럼·마이그레이션 없이 기존 원본 키 클레임 조회로 판정합니다.endsAt+30일) 이후는 13409입니다.docs/spec/MSG-440.md, 작업 로그·실측 SQL 포함), PRD 확정 3건 반영, SRS 상태 승격(FR-EVENT-08 구현됨·09/10 진행 중)과 rtm 재생성, status.md 갱신.🤔 고민한 내용
멱등 판정을 마감 판정보다 먼저 둡니다. 마감 직전에 커밋된 업로드의 응답이 유실되고 재시도가 마감 뒤에 도착하면, 순서가 반대일 때 멱등 보장이 깨집니다(Codex 리뷰 적발). replay 응답은
occupied=false·newBadges=[]고정으로 계약을 명시했습니다 — 원래 값을 재구성할 수 없어서입니다.멱등 보장 경계는 대상 영상의 교체·삭제 전까지입니다. 교체가 원본 키 클레임을 덮어써 그 뒤의 구 재시도는 replay를 찾지 못하는데, 교체·삭제는 확정 응답을 받은 클라이언트만 할 수 있어 응답 유실 재시도와 실행 순서가 겹치지 않습니다(PRD §10에 같은 경계 명시). 클레임 불변화는 공유 코어 후속 티켓 후보로 남겼습니다.
위치 잠금 획득 후 회차를 재독(
EntityManager.refresh) 합니다. 잠금 대기 중 부팅 리시드가 회차 일정을 바꾸면 영속성 컨텍스트에 캐시된 낡은 값으로 창 판정을 하게 되는 구멍을 막습니다. refresh 줄을 지운 돌연변이로 테스트가 실제로 깨지는지 확인했습니다.피드 커서에
locationId를 바인딩합니다. 다른 위치에서 발급된 커서를 그대로 쓰면 경계값이 오적용돼 결과가 조용히 잘리기 때문으로,VideoCursor가 gridId를 넣은 것과 같은 이유입니다. 핵심 쿼리(실측):미션 훅은 공용 코어 밖에 뒀습니다. 행사 업로드의 미션 비연계(MSG-438 확정)를 트리거 쪽에서 구조적으로 보장해, MSG-450(안티조인) 배포가 늦어도 오지급이 생기지 않습니다.
피드 카드의 도움돼요·댓글 수 필드는 만들지 않았습니다 — 집계 원천이 MSG-441에서 생기므로 그 티켓이 DTO에 필드를 추가합니다(자리 예약만 문서화).
👀 리뷰 포인트
VideoServiceImpl의 확정 코어 추출(confirmAndStore)이 기존 좌표 업로드 경로의 동작을 바꾸지 않았는지 — 기존 테스트 전부 green이지만 diff가 커서 눈으로 한 번 봐 주시면 좋겠습니다.Footnotes
멱등 키: 같은 요청을 여러 번 보내도 결과가 한 번과 같도록, 서버가 재시도를 알아보는 데 쓰는 요청 식별자입니다. 모바일에서 응답 유실 후 재시도가 흔해 업로드 확정에 필요합니다. ↩
keyset 커서: 페이지 번호 대신 "마지막으로 본 항목의 정렬 키"를 기준으로 다음 페이지를 끊는 방식입니다. 새 업로드가 끼어들어도 중복·누락 없이 이어집니다. ↩