Repository navigation
토너먼트 CLONE 잔재 정리 (4-1단계) #1188
Copy link
Copy link
Labels
refactor구조 개선, 외부 동작 불변구조 개선, 외부 동작 불변
Description
왜
#1027 4단계 미착수
- CLONE 개념 제거 - 애그리거트 경계를 바로잡아 토너먼트(정의)와 플레이(진행)를 분리 #1027 1-3단계는 CLONE 개념 제거 — 진행 상태를 참여 행으로 (#1027 Phase 1-3) #1044 · 백필이 다중 참가 클론을 참가자별로 평탄화 (#1027 dev 배포 실패 수정) #1089 · 백필이 NULL tuId 클론 이력을 유일 참여자에게 귀속 (#1027 CodeRabbit 대응) #1090 으로 머지, 9/22 Promote 로 prod 반영
- 4단계(제거)는 플레이 링크 수명 14일 이후로 미뤄 둠
- 결과: 10/6 에 유예 종료. 4단계를 추적하는 이슈 없음
- CLONE 개념 제거 - 애그리거트 경계를 바로잡아 토너먼트(정의)와 플레이(진행)를 분리 #1027 은 CLONE 개념 제거 — 진행 상태를 참여 행으로 (#1027 Phase 1-3) #1044 머지 때 함께 닫힘
한 번에 지우면 옛 클론 URL 이 깨짐
- 클론 행이 리다이렉트 껍데기로 남아 있음
- 옛 클론 id 요청은
rootOf·rootForUpdate가 ROOT 로 해소- 적용 메서드 8곳
- 지금 그 요청이 실제로 오는지 측정값 없음
- 위험: shim · 클론 행 · 컬럼을 한 번에 지우면 옛 URL 사용자가 404
- 참조:
db/migration/CLAUDE.md의 destructive 작업 단계 배포 규약
도달할 수 없는 코드와 낡은 문서가 남아 있음
| 대상 | 현재 상태 |
|---|---|
| 에러 코드 024 · 029 · 031 | 서비스에서 던지는 곳 0곳. API 문서 예시에만 남아 실제로 안 나는 응답을 계약처럼 안내 |
findBySourceTournamentId |
호출 0곳 |
getEffectiveTournamentItems 의 sourceTournamentId ?: 분기 |
호출자 5곳 모두 ROOT 로 해소된 토너먼트를 넘김 |
API 설명 · 이벤트 · TournamentPlayType 주석 |
CLONE 이 살아 있던 시절 기준 서술 |
참여 행 id 참조의 근거가 기록으로 없음
- 토너먼트 도메인은 User 를 끌어와 쓰지 않음
- 방장 · 히스토리는
user_id가 아니라 참여 행 id(tournament_users.id)로 가리킴tournaments.owner_tournament_user_idtournament_histories.tournament_user_id
user_id로 바꾸자는 질문이 팀에서 나옴- 원인: 왜 참여 행 id 인지 코드 · 문서 어디에도 정리되지 않음
무엇을
단계 구성
| 단계 | 내용 | 서비스 영향 |
|---|---|---|
| 4-1 (이 이슈) | 도달 불가 코드 제거 · shim 적중 관측 로그 추가 · 낡은 설명 정정 | 없음 |
| 4-2 (후속) | 적중 0건 확인 뒤 shim · 032 · 038 가드 제거, 클론 행 정리, 엔티티 컬럼 매핑 해제 | 옛 클론 URL 한정 |
| 4-3 (후속) | source_tournament_id 컬럼 · 인덱스 DROP |
없음 (4-2 prod 반영 뒤) |
4-1 범위
- 에러 코드 024 · 029 · 031 제거
- enum 엔트리 · 팩토리 · API 문서 예시 함께 제거
- 번호는 결번 유지
findBySourceTournamentId제거getEffectiveTournamentItems의 클론 분기 제거rootOf·rootForUpdate· 클론 가드가 실제로 클론 id 를 받았을 때 관측 로그 남김- 4-2 착수 판단 근거
- API 설명 · 주석을 현재 모델 기준으로 정정
isRoot는 항상true,sourceTournamentId는 항상null
4-1 에서 유지
- 응답 필드
isRoot·sourceTournamentId- 원인: 클라 계약. 제거는 클라 정리 뒤 별도
- 리다이렉트 shim · 032 · 038 가드
- 원인: 옛 클론 id 요청의 응답을 그대로 지킴
- 적용된 마이그레이션과
CloneFlattenBackfill- 원인: 적용된 Flyway 마이그레이션은 수정 · 삭제 금지
참여 행 id 를 유지하는 근거 정리
| 축 | 참여 행 id (현행) | user_id 로 바꾼 경우 |
|---|---|---|
| 게스트 승계 (#1081) | 참여 행 · 아이템 두 곳만 이관. 방장 · 히스토리는 행 id 를 따라 자동 유지 | 방장 · 히스토리 user_id 까지 직접 갱신. FK 없음이라 누락을 DB 가 못 막음 |
| 승계 중 충돌 병합 | 게스트 히스토리가 접힌 게스트 행에 묶인 채 남음 | 같은 방에서 게스트 · 회원 히스토리가 한 user_id 로 섞임 |
| 대진표 seed | seedOf(tournamentUserId, round). 승계 뒤에도 순서 동일 |
user_id 가 바뀌면 진행 중 대진표가 다시 섞임 |
| 애그리거트 경계 | User 와의 접점이 참여 행 하나. 탈퇴 · 승계 영향이 한 곳 | 토너먼트 테이블 여러 곳이 User 식별자에 직접 의존 |
| 표시명 (#1018) | 참여 닉네임 스냅샷이 참여 행에 있음. User 조회 없이 표시 | 표시 때마다 User 조회 또는 별도 스냅샷 필요 |
- 바뀌는 값(user_id)이 아니라 "이 방에서의 이 참여"라는 바뀌지 않는 값을 키로 둠
- 예외:
tournament_items.user_id는 아이템을 담은 사람이라 user_id 유지- 비용: 게스트 승계 때 아이템만 따로 이관
- 이 근거를 PR 본문과
TournamentUser주석에 남김
후속
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
refactor구조 개선, 외부 동작 불변구조 개선, 외부 동작 불변
Activity