Skip to content

feat: 설정·썸네일·방 세션 인증·칭호 획득 UI 개선 - #52

Merged
aryu1217 merged 20 commits into
mainfrom
dev
Aug 17, 2026
Merged

feat: 설정·썸네일·방 세션 인증·칭호 획득 UI 개선#52
aryu1217 merged 20 commits into
mainfrom
dev

Conversation

@aryu1217

@aryu1217 aryu1217 commented Aug 17, 2026

Copy link
Copy Markdown
Member

변경 내용

  • 설정 닉네임 입력에 현재 글자 수/19 카운터를 추가하고 19자 저장 경계를 회귀 테스트로 고정했습니다.
  • 반복 QueryClient fixture를 공용 테스트 helper로 정리하고, 방 재생·프로필 음악력의 큰 UI 컴포넌트에서 interaction/state 책임을 분리했습니다.
  • 방 생성·수정 썸네일을 동일한 업로드/기본 이미지 카드 UI로 통합하고 조건부 X를 제거했습니다.
  • 수정에서 기존 서버 이미지를 기본 이미지로 바꾸어 저장하면 DELETE /api/v2/rooms/{slug}/thumbnail를 호출하고 관련 방 캐시를 갱신합니다.
  • 최초 방 입장은 비밀번호, 재접속은 roomAccessToken으로 구분하고 토큰을 방별 sessionStorage에 보관합니다.
  • 방 내부 REST와 방/채팅 STOMP 구독에 X-Room-Access-Token을 적용하고 평문 비밀번호 저장·헤더 계약을 제거했습니다.
  • 비밀번호 변경 뒤에도 기존 참가 토큰으로 세션을 유지하며, ROOM_INFO_UPDATED 수신 시 전체 방 메타를 다시 조회하고 방 정보가 변경되었어요 토스트를 중복 없이 표시합니다.
  • 명시적 퇴장·강퇴·세션 교체·방 삭제·접근 거부에서는 토큰을 지우고, 단순 소켓 종료에서는 재접속을 위해 유지합니다.
  • badge-awarded SSE의 nullable description을 파싱하고 새 칭호를 순차 표시하는 496×370 획득 모달을 적용했습니다.
  • 획득 모달의 적용하기로 새 칭호를 즉시 대표 칭호로 설정하며, 성공·실패·pending·포커스 복원과 관련 캐시 갱신을 처리합니다.

변경 이유

  • 닉네임 최대 길이는 19자지만 설정 화면에서 현재 입력 길이를 확인할 수 없었습니다.
  • 테스트 수 자체보다 중복된 QueryClient setup과 큰 room/profile 컴포넌트 책임이 변경 비용을 키우고 있었습니다.
  • 방 수정 썸네일은 생성과 다른 단일 업로드 UI였고 기존 이미지를 기본 이미지로 되돌릴 저장 경로가 없었습니다.
  • 기존 방 인증은 입장 성공 뒤에도 평문 비밀번호를 보관·재사용해 비밀번호 변경과 재접속 계약을 안정적으로 처리할 수 없었습니다.
  • 기존 칭호 알림은 새 SSE 응답의 설명을 보여 주지 못했고, 대표 칭호를 적용하려면 별도 설정 화면으로 이동해야 했습니다.

영향 범위

  • UI / 사용자 흐름
  • API 요청·응답 계약
  • React Query 캐시
  • WebSocket / 실시간 상태
  • 인증 / 보안
  • 문서 / 개발 도구

검증

  • npm run lint
  • npm run test
  • npm run build
  • 관련 수동 시나리오 확인
  • 실패·로딩·빈 상태 확인

검증 결과 및 재현 방법:

  • 전체 Vitest: 145 files / 558 tests 통과
  • 칭호 획득 모달 focused: 4 files / 13 tests 통과
  • roomAccessToken 최종 focused: 4 files / 27 tests 통과
  • roomAccessToken 계약별 targeted: 9 files / 78 tests 통과
  • 설정·구조 최적화 targeted: 22 + 17 + 31 + 19 tests 통과
  • 썸네일 focused: 6 files / 39 tests 통과
  • 썸네일 PUT/DELETE 상호배제 후속: 2 files / 28 tests 통과
  • npm run lint, npm run build, git diff --check 통과
  • 각 실행 범위 fresh read-only QA pass, blocker 없음
  • 최신 GitHub Actions 결과는 아래 PR checks에서 추적합니다.
  • 실제 로그인 SSE와 픽셀 단위 브라우저 QA는 수행하지 못했습니다.

리뷰 포인트

  • 최초 join payload의 password와 재접속 payload의 accessToken이 상호 배타적인지
  • own ROOM_JOINED 검증 뒤 토큰을 먼저 저장하고, 해당 토큰으로만 방 내부 REST와 토픽 구독을 시작하는지
  • 토큰이 URL·로그·React Query key에 노출되지 않고 종료 사유별 보존/삭제 규칙을 지키는지
  • 비밀번호 변경 이벤트가 기존 참가자의 재입장을 유발하지 않고 전체 방 메타 갱신과 단일 토스트만 발생시키는지
  • 썸네일 기본 이미지 선택이 기존 서버 이미지에서만 DELETE를 예약하고, 새 파일 token이 있으면 PUT만 호출하는지
  • 일반 정보 PATCH 뒤 썸네일 PUT/DELETE 실패 재시도에서 PATCH가 중복되지 않는지
  • 닉네임 카운터가 IME 입력과 19자 저장 payload 경계를 그대로 보존하는지
  • 칭호 description 원문·다중 칭호 순서가 유지되고, 대표 칭호 적용 성공/실패와 관련 캐시 갱신이 일관적인지
  • 모달이 Tab 포커스를 가두고 pending 해제·전체 queue 종료 시 올바른 위치로 포커스를 복원하는지

기능별 커밋

  • 4839cfc — 설정 닉네임 19자 카운터 추가
  • 255dfdc — React Query 테스트 설정 공용화
  • 8f674a5 — 방 재생 입장과 joined UI 책임 분리
  • 4da8343 — 테스트 query context binding 정리
  • 6b57d01 — 음악력 상태와 프로필 패널 책임 분리
  • e483af6 — 구조 최적화 경계 회귀 테스트 보강
  • 27a7b31, dbd3352 — 설정·구조 최적화 QA와 전달 기록
  • 4d24a28 — 방 썸네일 삭제와 생성·수정 선택 UI 통합
  • b2f5ca2 — 썸네일 QA와 전달 기록
  • 010d0c9 — 방 세션 인증을 roomAccessToken 계약으로 전환
  • 0d70f97 — roomAccessToken QA와 전달 상태 기록
  • 52725cf — roomAccessToken CI와 전달 완료 기록
  • 58f460a — 칭호 획득 모달과 대표 칭호 적용 개선
  • f22d11d — 칭호 획득 모달 QA와 전달 기록

위험 및 후속 작업

  • RoomMeta.thumbnailUrl(s)를 현재 곡 이미지로 설명한 8/5 문서와, 이를 기존 편집 썸네일로 사용하는 최신 수정 흐름 사이에 계약 문서 불일치가 있습니다. 별도 custom-thumbnail 판별 필드가 없으므로 이번 변경은 최신 확정 계약과 기존 8/11 이후 수정 흐름을 따릅니다.
  • 토큰 계약은 deprecated 비밀번호 header fallback 없이 전환했습니다. 백엔드가 새 계약과 함께 배포되어야 합니다.
  • 칭호 SSE는 서버의 최근 이벤트 임시 보관 정책을 따르므로 서버 재시작이나 장시간 미접속 시 과거 알림이 재생되지 않을 수 있습니다.
  • DOM·상태·API 분기는 자동화 테스트로 확인했지만 실제 로그인 SSE와 브라우저 픽셀 QA는 남아 있습니다.

추적 정보

  • Linked issue: 없음
  • Execution plans:
    • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/
    • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/
    • docs/exec-plans/active/2026-08-17-room-access-token/
    • docs/exec-plans/active/2026-08-18-badge-award-modal/
  • Selected skills: queuing-feature-delivery, queuing-orchestrator, queuing-api-boundary, queuing-ui-flow, frontend-architecture-guardrails, queuing-qa-reviewer
  • QA result: pass

화면 변경

  • 설정 닉네임 카운터, 방 생성·수정 썸네일 카드 UI, 방 정보 변경 토스트, 칭호 획득·대표 칭호 적용 모달을 변경했습니다.
  • 실제 화면 캡처는 브라우저 연결 QA 후 보완 가능합니다.

@vercel

vercel Bot commented Aug 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
queuing Ready Ready Preview Aug 17, 2026 5:23pm

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 158 files, which is 58 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: be12fdcd-27ea-4f1c-9822-11bb04609dbd

📥 Commits

Reviewing files that changed from the base of the PR and between e728284 and 57a537b.

📒 Files selected for processing (158)
  • .agents/skills/queuing-api-boundary/SKILL.md
  • .agents/skills/queuing-ui-flow/SKILL.md
  • ARCHITECTURE.md
  • docs/exec-plans/active/2026-08-17-room-access-token/api-contract.md
  • docs/exec-plans/active/2026-08-17-room-access-token/delivery-state.md
  • docs/exec-plans/active/2026-08-17-room-access-token/plan.md
  • docs/exec-plans/active/2026-08-17-room-access-token/qa-report.md
  • docs/exec-plans/active/2026-08-17-room-access-token/review-findings.md
  • docs/exec-plans/active/2026-08-17-room-access-token/ui-flow.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/api-contract.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/change-summary.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/delivery-state.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/handoff.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/plan.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/qa-report.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/request-summary.md
  • docs/exec-plans/active/2026-08-17-room-thumbnail-delete/ui-flow.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/api-contract.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/change-summary.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/delivery-state.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/handoff.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/implementation-notes.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/plan.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/qa-report.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/request-summary.md
  • docs/exec-plans/active/2026-08-17-settings-counter-test-structure/ui-flow.md
  • docs/exec-plans/active/2026-08-18-badge-award-modal/delivery-state.md
  • docs/exec-plans/active/2026-08-18-badge-award-modal/plan.md
  • docs/exec-plans/active/2026-08-18-badge-award-modal/qa-report.md
  • docs/exec-plans/active/2026-08-18-badge-award-modal/review-findings.md
  • docs/exec-plans/active/README.md
  • src/features/badge/events/model/badgeAwardEvents.test.ts
  • src/features/badge/events/model/badgeAwardEvents.ts
  • src/features/badge/events/ui/BadgeAwardModal.module.css
  • src/features/badge/events/ui/BadgeAwardModal.test.tsx
  • src/features/badge/events/ui/BadgeAwardModal.tsx
  • src/features/badge/events/ui/BadgeAwardProvider.test.tsx
  • src/features/badge/events/ui/BadgeAwardProvider.tsx
  • src/features/playlist/add-track/hooks/useAddTrackAction.test.tsx
  • src/features/playlist/add-track/hooks/useAddTrackAction.ts
  • src/features/playlist/add-track/ui/AddTrackAction.tsx
  • src/features/playlist/api/deleteMyQueueEntry.ts
  • src/features/playlist/api/deleteRoomQueueEntries.ts
  • src/features/playlist/api/fetchRoomParticipants.ts
  • src/features/playlist/api/fetchRoomPlayback.ts
  • src/features/playlist/api/fetchRoomQueue.ts
  • src/features/playlist/api/moveMyQueueEntry.ts
  • src/features/playlist/api/moveRoomQueueEntry.ts
  • src/features/playlist/api/queueMutations.test.ts
  • src/features/playlist/api/roomReadCancellation.test.ts
  • src/features/playlist/api/roomReads.test.ts
  • src/features/playlist/model/queryKeys.ts
  • src/features/playlist/model/types.ts
  • src/features/playlist/model/useMoveMyQueueEntry.ts
  • src/features/playlist/model/useMoveRoomQueueEntry.ts
  • src/features/playlist/model/useMyQueueMutations.test.tsx
  • src/features/playlist/model/useMyRoomQueue.test.tsx
  • src/features/playlist/model/useMyRoomQueue.ts
  • src/features/playlist/model/useRoomParticipants.test.tsx
  • src/features/playlist/model/useRoomParticipants.ts
  • src/features/playlist/model/useRoomPlayback.ts
  • src/features/playlist/model/useRoomQueue.ts
  • src/features/playlist/model/useRoomReads.test.ts
  • src/features/room/api/deleteRoom.ts
  • src/features/room/api/deleteRoomThumbnail.test.ts
  • src/features/room/api/deleteRoomThumbnail.ts
  • src/features/room/api/fetchRoomChats.test.ts
  • src/features/room/api/fetchRoomChats.ts
  • src/features/room/api/joinRoom.test.ts
  • src/features/room/api/joinRoom.types.ts
  • src/features/room/api/kickRoomParticipant.ts
  • src/features/room/api/transferRoomOwner.test.ts
  • src/features/room/api/transferRoomOwner.ts
  • src/features/room/api/types.ts
  • src/features/room/api/updateRoom.ts
  • src/features/room/api/updateRoomThumbnail.test.ts
  • src/features/room/api/updateRoomThumbnail.ts
  • src/features/room/api/websocket/publishJoinRequest.ts
  • src/features/room/api/websocket/roomAccessTokenSubscriptions.test.ts
  • src/features/room/api/websocket/subscribeRoomChatEvents.ts
  • src/features/room/api/websocket/subscribeRoomEvents.ts
  • src/features/room/api/websocket/subscribeUserJoinEvents.test.ts
  • src/features/room/api/websocket/subscribeUserJoinEvents.ts
  • src/features/room/chat/api/reportChatMessage.test.ts
  • src/features/room/chat/api/reportChatMessage.ts
  • src/features/room/chat/hooks/useRoomChat.ts
  • src/features/room/chat/hooks/useRoomChatHistory.test.tsx
  • src/features/room/chat/hooks/useRoomChatHistory.ts
  • src/features/room/chat/hooks/useRoomChatRealtime.test.tsx
  • src/features/room/chat/hooks/useRoomChatRealtime.ts
  • src/features/room/chat/ui/ChatArea.test.tsx
  • src/features/room/chat/ui/ChatArea.tsx
  • src/features/room/chat/ui/ReportChatMessageModal.test.tsx
  • src/features/room/chat/ui/ReportChatMessageModal.tsx
  • src/features/room/create/ui/CreateBasicInfoStep.module.css
  • src/features/room/create/ui/CreateBasicInfoStep.tsx
  • src/features/room/create/ui/EditRoomFormModal.module.css
  • src/features/room/create/ui/EditRoomFormModal.test.tsx
  • src/features/room/create/ui/EditRoomFormModal.tsx
  • src/features/room/create/ui/RoomFormModal.test.tsx
  • src/features/room/create/ui/RoomFormModal.tsx
  • src/features/room/create/ui/RoomThumbnailSettingField.module.css
  • src/features/room/create/ui/RoomThumbnailSettingField.tsx
  • src/features/room/create/ui/RoomThumbnailUploadField.module.css
  • src/features/room/create/ui/RoomThumbnailUploadField.tsx
  • src/features/room/floating/ui/RoomFloatingWidgets.tsx
  • src/features/room/hooks/useTransferRoomOwner.test.tsx
  • src/features/room/join/lib/roomAccessTokenStorage.test.ts
  • src/features/room/join/lib/roomAccessTokenStorage.ts
  • src/features/room/join/lib/roomJoinPasswordStorage.ts
  • src/features/room/join/model/roomJoinHandoff.ts
  • src/features/room/join/model/useRoomEntry.test.tsx
  • src/features/room/join/model/useRoomEntry.ts
  • src/features/room/join/model/useRoomJoinTransition.test.tsx
  • src/features/room/join/model/useRoomJoinTransition.ts
  • src/features/room/lib/getDefaultRoomImage.test.ts
  • src/features/room/lib/getDefaultRoomImage.ts
  • src/features/room/model/types.ts
  • src/features/room/page/hooks/useRoomRealtimeEvents.test.tsx
  • src/features/room/page/hooks/useRoomRealtimeEvents.ts
  • src/features/room/page/ui/RoomPlaybackJoinedContent.tsx
  • src/features/room/page/ui/RoomPlaybackScreen.test.tsx
  • src/features/room/page/ui/RoomPlaybackScreen.tsx
  • src/features/room/participants/ui/RoomParticipantsPanel.test.tsx
  • src/features/room/participants/ui/RoomParticipantsPanel.tsx
  • src/features/room/profile/api/currentTrackMusicPower.test.ts
  • src/features/room/profile/api/setCurrentTrackMusicPowerVote.ts
  • src/features/room/profile/hooks/useCurrentTrackMusicPowerVote.ts
  • src/features/room/profile/hooks/useRoomMusicPowerVote.test.tsx
  • src/features/room/profile/hooks/useRoomMusicPowerVote.ts
  • src/features/room/profile/ui/RoomMusicPowerActions.tsx
  • src/features/room/profile/ui/RoomProfilePanel.test.tsx
  • src/features/room/profile/ui/RoomProfilePanel.tsx
  • src/features/room/queue/hooks/useRoomQueuePanel.test.tsx
  • src/features/room/queue/hooks/useRoomQueuePanel.ts
  • src/features/room/queue/ui/RoomQueuePanel.tsx
  • src/features/room/queue/ui/RoomQueuePanelView.tsx
  • src/features/room/update/hooks/useEditRoomForm.test.tsx
  • src/features/room/update/hooks/useEditRoomForm.ts
  • src/features/room/update/model/useDeleteRoom.ts
  • src/features/room/update/model/useDeleteRoomThumbnail.test.tsx
  • src/features/room/update/model/useDeleteRoomThumbnail.ts
  • src/features/room/update/model/useUpdateRoomThumbnail.test.tsx
  • src/features/room/update/ui/UpdateRoomButton.tsx
  • src/features/settings/hooks/useProfileSettingsForm.test.tsx
  • src/features/settings/hooks/useProfileSettingsForm.ts
  • src/features/settings/model/profileSettingsLimits.ts
  • src/features/settings/ui/ProfileSettingsTab.test.tsx
  • src/features/settings/ui/components/ProfileSettingsForm.tsx
  • src/features/user/profile/api/fetchMusicPower.ts
  • src/features/user/profile/hooks/useMusicPower.ts
  • src/shared/api/roomAccessTokenHeaders.test.ts
  • src/shared/api/roomAccessTokenHeaders.ts
  • src/shared/api/roomPasswordHeaders.ts
  • src/shared/api/websocket/roomAccessTokenSubscriptionHeaders.ts
  • src/shared/api/websocket/roomPasswordSubscriptionHeaders.ts
  • src/shared/test/queryClient.test.ts
  • src/shared/test/queryClient.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

@aryu1217 aryu1217 changed the title feat: 설정 구조 최적화와 방 썸네일 삭제 feat: 설정·썸네일·방 세션 인증 개선 Aug 17, 2026
@aryu1217 aryu1217 changed the title feat: 설정·썸네일·방 세션 인증 개선 feat: 설정·썸네일·방 세션 인증·칭호 획득 UI 개선 Aug 17, 2026
@aryu1217
aryu1217 marked this pull request as ready for review August 17, 2026 16:27

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f22d11da00

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

reconnectPendingRef.current = false;
if (config) {
clearStoredRoomAccessToken(config.slug);
onRoomAccessTokenChanged(null);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge 홈 이동이 끝날 때까지 접근 토큰 상태를 유지하세요

사용자가 나가기를 확인해 leave publish가 성공하면 여기서 부모의 토큰 상태를 즉시 null로 바꾸므로 RoomPlaybackScreen이 토큰 없음 화면으로 전환하면서 RoomLeaveConfirmDialog를 언마운트합니다. 이 다이얼로그의 cleanup은 홈으로 이동시키는 500ms 타이머를 취소하기 때문에, 실제 방 세션에서는 나가기가 서버에서 처리된 뒤에도 /room/{slug}의 오류 화면에 계속 머무르게 됩니다. 즉시 라우팅하거나, 라우팅이 완료될 때까지 이 상태 변경을 지연해야 합니다.

AGENTS.md reference: AGENTS.md:L9-L9

Useful? React with 👍 / 👎.

Comment on lines +52 to 55
initialThumbnailUrl={getRoomThumbnailSrc({
thumbnailUrl: roomMeta.thumbnailUrl,
thumbnailUrls: roomMeta.thumbnailUrls,
})}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 현재 곡 이미지를 편집 가능한 방 썸네일로 취급하지 마세요

현재 계약에서 RoomMeta.thumbnailUrl(s)는 업로드한 방 썸네일의 존재 여부가 아니라 현재 재생 곡 이미지를 나타냅니다. 따라서 곡이 재생 중인 방에서 이 값을 initialThumbnailUrl로 넘기면 편집 폼은 initialHasThumbnail을 참으로 간주하고, 방장이 기본 이미지를 선택해 저장할 때 실제 사용자 업로드가 없더라도 DELETE /api/v2/rooms/{slug}/thumbnail을 호출합니다. 별도의 커스텀 썸네일 URL 또는 존재 플래그를 사용하지 않으면 초기 선택과 삭제 의도를 신뢰할 수 없습니다.

AGENTS.md reference: AGENTS.md:L21-L21

Useful? React with 👍 / 👎.

Comment on lines +357 to +361
} catch (joinError) {
notify({
dedupeKey: `room-join:${normalizeRoomSlug(result.slug)}`,
message:
joinError instanceof Error && joinError.message

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 생성 성공 후 입장 실패를 재생성 흐름으로 남기지 마세요

방 생성 POST는 성공했지만 이어지는 WebSocket join이 타임아웃되거나 일시적으로 실패하는 경우, 이 catch는 알림만 표시하고 생성된 result.slug를 보존하거나 해당 방으로 이동하지 않은 채 폼을 다시 활성화합니다. 사용자가 완료 버튼을 재시도하면 join이 아니라 createRoomMutation부터 다시 실행되어 이미 방장이 된 상태의 충돌만 받고, 방금 생성한 방으로 진입할 복구 경로가 사라집니다. 생성 결과를 보존해 join만 재시도하거나, 방 화면의 joining 상태가 복구를 담당하도록 생성된 경로로 이동해야 합니다.

AGENTS.md reference: AGENTS.md:L22-L23

Useful? React with 👍 / 👎.

@aryu1217
aryu1217 merged commit f66f631 into main Aug 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant