MSG-439 feat: 행사 조회 API 4종 추가 - #197
Merged
Merged
Conversation
|
Claude finished @s13121312's task in 2m 53s —— View job 리뷰 완료확인 범위: 병렬 브랜치 경합(마이그레이션 번호·developCode 13xxx 대역· 발견 없음.
|
테스트 커버리지
|
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.
🎫 관련 티켓
작업 내용
행사방의 읽기 경로 4종을 추가했습니다. 지도 홈 칩부터 위치별 피드 진입 직전까지, 사용자가 지역에서 행사, 행사 위치로 내려가는 조회입니다.
GET /api/event-occurrences뷰포트 행사 칩 목록. 노출 영역 사각형과 뷰포트의 격자 겹침 판정, 시 이름과 시작일 순 정렬GET /api/event-occurrences/{id}회차 상세. 파생 상태, 이전 회차 목록, 알림 구독 필드(값은 MSG-442 전까지 false 고정)GET /api/event-occurrences/{id}/locations위치 목록. 영역 격자, 대표 격자, 표시명 재료, 영상 수 실측GET /api/grids/{gridId}/event-locations격자 역조회. 영역 내 어느 격자를 눌러도 같은 위치가 나오는 피드 진입 경로같이 들어간 것:
GridQueryService.resolveRegionNames추가. grids 행이 없는 격자도 중심점으로 행정동 이름을 판정합니다(lazy insert1 때문에 행사 대표 격자는 행이 없는 게 정상이라, grids를 조인하는 기존 리포지토리 메서드로는 이름이 안 나옵니다)SecurityConfig에 조회 4경로 GET 한정 permitAll. 웹 비로그인 열람 개방이고 쓰기는 로그인 유지입니다. 무효 토큰은 여전히 2401로 거절됩니다(선택적 인증2)🤔 고민한 내용
상태는 저장하지 않고 조회 시점에 파생 계산합니다. DB에 status 컬럼이 없고
statusAt(now)반개구간3 판정 하나를 네 조회가 공유합니다. 상태 전환 배치가 필요 없어지고, 종료 정각의 쓰기 허용 여부 같은 경계가 코드 한 곳에 모입니다. 대가는 서버 시각 의존이라 Clock을 UTC로 고정 주입했습니다.영상 수 술어를 전역 노출 게이트와 동등하게 맞췄습니다. 위치 목록의 영상 수는
event_videos JOIN videos후 ACTIVE, PUBLIC, READY 조건의 단일 GROUP BY 한 번입니다.카운트와 피드(MSG-440)가 다른 정의를 쓰면 숫자에는 잡히는데 목록에는 없는 불일치가 생기고, 비공개 영상의 존재가 숫자로 새어 나갑니다.
뷰포트 겹침에 사방 1칸 보정을 넣었습니다. 꼭짓점 4점 투영만으로는 중앙자오선을 품는 뷰포트에서 남쪽 한 행이 빠집니다(실측 이탈 29.6m, MSG-398에서 잰 값). mission의
PROJECTION_PAD_CELLS선례를 그대로 따랐고, 보정은 과다 포함 쪽으로만 틀립니다.역조회 첫 항목이 진입 기본값이라는 서버 계약을 정렬로 못박았습니다. 상태 우선순위 LIVE, UPCOMING, UPLOAD_GRACE, ARCHIVED 순이고, 예정이 유예보다 앞인 이유는 이전 회차 유예 중에 새 회차가 공개되면 새 회차가 현재이기 때문입니다(PRD의 "기본 화면은 현재 회차"). 예정끼리는 임박한 것이 먼저, 지난 것끼리는 최근이 먼저입니다.
행사 후보는 전량 조회 후 자바에서 거릅니다. 등재가 초대형 행사 한정이라 도시당 한둘이고, 이 규모 전제에서 공간 인덱스는 과설계라 판단했습니다. 전제가 깨지는 시점이 승격 시점이고 주석에 남겼습니다.
👀 리뷰 포인트
visible_from <= now)에 따로 있습니다. 나머지 세 API의 자바 술어와 결과가 같은 근거는 visible_from이 DDL CHECK로 시작 2주 전에 고정돼 있어서인데, 노출 정책이 바뀌면 두 곳을 같이 고쳐야 합니다. 이 결합을 스펙 작업 로그에 남겼지만 더 좋은 표현이 있으면 의견 부탁드립니다.resolveRegionNames가 격자당 공간 판정 1회를 도는 루프입니다. 회차당 위치가 한 자릿수라는 전제이고 상한과 승격 경로를 javadoc에 적었는데, 전제가 과한지 봐주시면 좋겠습니다.Footnotes
lazy insert: 격자를 미리 저장하지 않고 실제로 영상이 올라오는 순간에만 grids 테이블에 행을 만드는 이 프로젝트의 전략. 그래서 "격자가 존재한다"와 "grids에 행이 있다"는 다른 말입니다. ↩
선택적 인증: 인증 없이도 통과시키되, Authorization 헤더가 있으면 검증은 그대로 수행하는 방식. permitAll은 토큰 검증 생략이 아니라서 무효 토큰은 2401로 거절됩니다. ↩
반개구간: 시작은 포함하고 끝은 제외하는 구간(이상, 미만). 종료 정각이 LIVE가 아니라 유예로 판정돼야 "종료 시점부터 즉시 차단"이라는 요구와 맞아떨어집니다. ↩