Skip to content

게스트의 토너먼트 생성 제한을 클라 대응 전까지 임시 해제 - #966

Merged
m-a-king merged 1 commit into
devfrom
fix/965-allow-guest-tournament-create
Aug 20, 2026
Merged

게스트의 토너먼트 생성 제한을 클라 대응 전까지 임시 해제#966
m-a-king merged 1 commit into
devfrom
fix/965-allow-guest-tournament-create

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

Situation

#904 는 아이템 등록 한도를 계정 단위로 걸면서, 그 한도가 우회되지 않도록 토너먼트 생성을 회원 전용으로 좁혔다. 게스트 계정은 POST /auth/guest 로 입력값 없이 무한 발급되므로, 비용이 드는 행위의 소유자가 게스트면 계정을 갈아타는 것만으로 한도가 리셋되기 때문이다.

그 변경이 v1.2.0 promote(2026-08-13)로 prod 에 나갔는데, 클라이언트가 아직 이 403(TOURNAMENT-036)을 처리하지 못한다. 지금 prod(v1.3.1)에서 게스트가 토너먼트를 만들려 하면 앱이 해석하지 못하는 응답을 받는다.

게스트를 막는 지점은 코드 전체에 네 곳인데, 이번 promote 구간에서 새로 좁혀진 것은 토너먼트 생성 하나뿐이다.

막은 행위 code 들어간 PR 대상
토너먼트 생성 TOURNAMENT-036 #904 (2026-08-12) 이번 롤백 대상
위시리스트 전체 WISH-001 #572 (2026-06-19) 아님
회원 탈퇴 USER-007 #423 (2026-06-07) 아님
프로필 이미지 변경 USER-008 #459 (2026-06-08) 아님

아래 셋은 6월부터 있던 계약이라 클라가 이미 대응한 상태다. 그래서 되돌릴 범위는 하나로 좁혀진다.

Task

  • 클라 대응이 끝날 때까지 토너먼트 생성 게이트만 국소적으로 걷는다. 같은 함수에 얹혀 있는 다른 방어는 남긴다
  • 곧 되살릴 것을 전제로, 재적용 비용이 최소가 되는 형태로 남긴다
  • 게이트가 사라지면서 열리는 우회 경로를 명시하고, 그 창에서 무엇이 방어선으로 남는지 정한다

Action

무엇을 빼고 무엇을 남겼나

requireMember 는 두 가지를 함께 막고 있었다. 신분 검사(게스트 차단)와 탈퇴(tombstone) 계정 차단인데, 뒤쪽은 #691 사유라 이번 건과 무관하다. 신분 검사만 빼고, 남은 책임이 하나뿐이 되었으므로 이름도 rejectIfDeleted 로 바꿨다. 이름이 실제 계약과 어긋난 채로 남으면 다음 독자가 잘못 읽는다.

대상 처리 이유
TournamentService 의 신분 분기 제거 이번 롤백의 본체
같은 함수의 탈퇴 계정 차단 유지 #691 사유, 게스트 건과 무관
TOURNAMENT-036 enum 엔트리 유지 곧 되살릴 것이라 재적용을 한 줄 복구로 끝내려고. 번호는 append-only 라 남겨 둬도 재사용 위험이 없다
guestCannotCreateTournament() 팩토리 유지 위와 같음. 되살릴 때 그대로 쓴다
API 문서의 403 @ApiResponse + example 제거 도달 불가가 된 응답을 선언만 남기면 example 커버리지 메타 테스트가 깨지고, docs 가 실제 계약과 어긋난다

되살릴 위치는 rejectIfDeleted 주석에 복구할 한 줄 그대로 적어 뒀다. 코드와 문서에서 각각 무엇을 되돌려야 하는지 찾아다니지 않게 하려는 것이다.

테스트는 지우지 않고 뒤집었다

게스트 거부 테스트를 삭제하는 대신 반대 단언(201 + 실제 행 증가)으로 교체했다. 삭제하면 롤백이 실제로 동작하는지 아무도 확인하지 않고, 재적용 때 테스트를 새로 써야 한다. 뒤집어 두면 그 자리가 계약의 현재 상태를 계속 말한다.

이 테스트가 배선을 검증하는지는 negative control 로 확인했다. 게이트 한 줄을 임시로 되살리자 155건 중 이 테스트 하나만 실패했고, 원복 후 다시 통과했다.

Result

  • 게스트가 다시 토너먼트를 만들 수 있다. 생성 이후 흐름(참여, 아이템 담기, 플레이)은 원래 게스트에게 열려 있어 이번 변경과 무관하다
  • 감수하는 것: 게스트가 오너인 토너먼트의 아이템 등록은 그 게스트 몫(계정당 시간당 30)에서 깎이는데, 게스트 계정은 무한 발급되므로 계정별 한도 축이 이 창 동안 게스트에 대해 실효가 없다. 남는 방어선은 전역 가용량 상한(시간당 3000, SERVER_BUSY 503) 하나다
  • 게스트 전용 별도 한도는 두지 않았다. 한도를 신분별로 가르려면 판정 시점에 오너의 신분을 조회해 키와 상한을 나눠야 하는데, 곧 게이트를 되살릴 예정이라 임시 조치 대비 비용이 크다. 지금 조절 가능한 노브(계정 한도, 전역 상한)는 전 계정 공통이라 게스트만 조이는 데 쓸 수 없다
  • 관측이 조기 경보 역할을 한다. 전역 상한의 66% 지점 경고 로그가 Loki 알림 룰로 Discord 에 뜬다. 게스트 발 폭증이 보이면 백오피스(아이템 등록 한도를 백오피스에서 확인·조절 #946)로 배포 없이 전역 상한을 내리거나, 게이트를 다시 켜는 판단으로 넘어간다
  • 되돌릴 때는 이 PR 의 역순이면 된다. rejectIfDeleted 의 분기 한 줄과 API 문서의 403 선언, example 을 복구하고 테스트 단언을 원래대로 되돌린다. code 와 예외는 남아 있어 새로 만들 것이 없다

연관 이슈

- #904(v1.2.0 promote)에서 넣은 회원 전용 게이트가, 클라이언트의 403(TOURNAMENT-036) 대응 없이 prod 에 나갔다. 게스트가 토너먼트를 만들려 하면 클라가 해석하지 못하는 응답을 받고 있어 이 게이트만 국소적으로 걷는다
- requireMember 에서 identityType 분기만 빼고 탈퇴(tombstone) 계정 차단은 남긴다. 그쪽은 #691 사유라 게스트 건과 무관하다. 남은 책임이 하나뿐이라 이름도 rejectIfDeleted 로 바꿔 함수명이 실제 계약과 어긋나지 않게 했다
- TOURNAMENT-036 의 ErrorCode 엔트리와 예외 팩토리는 지우지 않았다. 곧 되살릴 것이라 재적용을 한 줄 복구로 끝내려는 것이고, 번호는 append-only 라 남겨 둬도 재사용 위험이 없다. 되살릴 자리는 rejectIfDeleted 주석에 적어 뒀다
- 반면 API 문서의 403 @apiresponse 와 example 은 지웠다. 도달 불가가 된 응답을 선언만 남기면 example 커버리지 메타 테스트가 깨지고, docs 가 실제 계약과 어긋난다
- 게스트 거부 테스트는 삭제 대신 반대 단언(201 + 실제 행 증가)으로 뒤집었다. 게이트를 임시로 되살리면 155건 중 이 테스트만 정확히 깨지는 것을 negative control 로 확인했다
- 감수하는 것: 게스트가 오너인 토너먼트의 아이템 등록은 그 게스트 몫에서 깎이는데 게스트 계정은 무한 발급되므로, 계정별 한도는 이 창 동안 게스트에 대해 실효가 없다. 남는 방어선은 전역 가용량 상한 하나다. 게스트 전용 별도 한도는 곧 게이트를 되살릴 예정이라 두지 않았다
@m-a-king m-a-king added the fix 외부 가시적 결함 수정 label Aug 20, 2026
@m-a-king m-a-king self-assigned this Aug 20, 2026
@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro Plus

Run ID: 7b2c9681-fa43-42af-96d6-88c83bcf0396


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@m-a-king
m-a-king merged commit 7ad0257 into dev Aug 20, 2026
8 checks passed
@m-a-king
m-a-king deleted the fix/965-allow-guest-tournament-create branch August 20, 2026 05:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix 외부 가시적 결함 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

게스트의 토너먼트 생성 제한을 클라 대응 전까지 임시 해제

1 participant