Skip to content

토너먼트 CLONE 잔재 정리 (4-1단계) #1188

Closed

Description

@sevineleven

왜

#1027 4단계 미착수

한 번에 지우면 옛 클론 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_id
    • tournament_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 주석에 남김

후속

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

refactor구조 개선, 외부 동작 불변

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions