Commit Graph

56 Commits

Author SHA1 Message Date
b9bdbcaabc feat: 웹 클라이언트 비주얼 오버홀 — 게임 에셋 적용
All checks were successful
Client CI/CD / test (push) Successful in 9s
Client CI/CD / deploy (push) Successful in 14s
- 홈페이지: 드래곤 히어로 배경(bg_loading), fixed 헤더, 로고, 마을 배경 다운로드 섹션
- 로그인/회원가입: 고딕 성문 배경(bg_login), 카드 프레임, 게임 버튼
- 공통: btn-game, card-game, divider-game CSS 클래스 추가
- 게임 에셋 PNG → WebP 변환 (6MB → 80~234KB)
- 관리자 페이지: 로고/divider 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 01:55:16 +09:00
7e7b3e85a7 fix: 마켓 API 요청 필드명 snake_case→camelCase 수정
All checks were successful
Client CI/CD / test (push) Successful in 9s
Client CI/CD / deploy (push) Successful in 14s
서버는 assetId/listingId(camelCase)를 기대하나
asset_id/listing_id(snake_case)로 보내고 있어 검증 실패.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 15:48:49 +09:00
1691638fe9 fix: 지갑 UI 필드명/응답 구조 불일치 수정
All checks were successful
Client CI/CD / test (push) Successful in 9s
Client CI/CD / deploy (push) Successful in 13s
서버 실제 응답과 프론트엔드 필드명이 맞지 않아 공개키 미표시,
인벤토리/마켓 TypeError 발생하던 버그 수정.

- WalletTab: public_key→pubKeyHex, private_key→privateKey
- InventoryTab: 배열→객체(slots) 구조 대응
- AssetsTab: 페이지네이션 응답, tradeable, active_listing_id, template_id
- MarketTab: ID 목록→개별 getListing 호출, listing_id→id, asset_id
- WalletSummary: 페이지네이션 + 인벤토리 객체 구조 대응
- chain.js: getListing() 함수 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 14:41:07 +09:00
60be6e1d39 fix: suppress exhaustive-deps warnings in admin components
All checks were successful
Client CI/CD / test (push) Successful in 9s
Client CI/CD / deploy (push) Successful in 19s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:44:58 +09:00
3dc1aad8ac feat: add wallet UI with 4 tabs and HomePage summary
- chain.js: API wrapper with Idempotency-Key auto-generation
- WalletPage: 4-tab container (wallet/assets/inventory/market)
- WalletTab: balance, address (truncated+copy), key export
- AssetsTab: asset list with detail expand, market listing
- InventoryTab: read-only slot display
- MarketTab: buy/cancel with confirm dialog, all/mine filter
- WalletSummary: HomePage card with balance + stats
- PrivateRoute guard for /wallet, header link on HomePage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:43:46 +09:00
8b6ba38a82 feat: add chain API wrapper with idempotency-key
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:38:36 +09:00
f6c95c9745 docs: wallet UI design spec
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 13:24:52 +09:00
a5af22478a Fix: Gitea 워크플로우에서 GitHub Action 의존 제거
All checks were successful
Client CI/CD / test (push) Successful in 9s
Client CI/CD / deploy (push) Successful in 15s
.gitea/workflows/deploy.yml이 실제 실행되는 파일.
actions/checkout, actions/setup-node, appleboy/ssh-action을
모두 직접 실행 방식으로 대체.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:58:47 +09:00
35dbdbba3b ci: trigger CI rebuild
Some checks failed
Client CI/CD / test (push) Waiting to run
Client CI/CD / deploy (push) Has been cancelled
2026-03-19 16:57:40 +09:00
32d87d8151 Fix: CI에서 actions/checkout도 제거 — 모든 GitHub Action 의존 완전 제거
Some checks failed
Client CI/CD / test (push) Waiting to run
Client CI/CD / deploy (push) Has been cancelled
Gitea runner가 github.com clone에서 멈추는 문제.
actions/checkout@v4도 git fetch로 직접 대체.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:50:10 +09:00
4232c80f2f Fix: CI를 Gitea runner 호환으로 변경 — GitHub Action 의존 제거
Some checks failed
Client CI/CD / test (push) Waiting to run
Client CI/CD / deploy (push) Has been cancelled
actions/setup-node → curl + apt-get 직접 설치
docker/login-action + build-push-action → docker CLI 직접 사용
appleboy/ssh-action → ssh 직접 실행

Gitea runner가 github.com에서 action clone 실패하는 문제 해결.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 16:40:30 +09:00
4e3a01428a fix: SSAFY OAuth 로그인 수정 및 API 클라이언트 안정성 개선 (8건)
Some checks failed
Client CI/CD / test (push) Waiting to run
Client CI/CD / deploy (push) Has been cancelled
- SSAFY OAuth state 파라미터 전달 추가 (로그인 불능 해결)
- POST/PUT/DELETE 5xx 및 네트워크 에러 재시도 방지 (멱등 요청만 재시도)
- UserAdmin 페이지네이션 추가 (offset/limit)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 23:26:40 +09:00
ae013acd2d fix: DownloadAdmin.test.jsx 미사용 waitFor import 제거 (ESLint)
Some checks failed
Client CI/CD / test (push) Failing after 12m21s
Client CI/CD / deploy (push) Has been cancelled
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:33:07 +09:00
dcb2d1847d ci: Gitea 환경으로 전환 (git.tolelom.xyz 레지스트리)
- Docker registry: ghcr.io → git.tolelom.xyz
- 로그인: GITEA_TOKEN 사용

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:25:27 +09:00
daeaaca902 ci: npm test 추가 + Docker GHCR 빌드/푸시 + SSH 배포 추가
- test job: lint + vitest + build
- docker job: main 머지 시 nginx 이미지 빌드/푸시
- deploy job: SSH로 docker compose pull web && up

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:21:55 +09:00
b2fe4519f8 fix: Vitest 4.x + jsdom 28 localStorage.clear 호환성 수정
Vitest 4.x가 jsdom에 --localstorage-file을 빈 경로로 전달할 때
localStorage가 .clear()가 없는 stub 객체가 되는 문제 수정.
setup.js에서 Storage 전체 구현체로 폴백.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-18 17:11:56 +09:00
2cea340163 feat: ErrorBoundary 개선 + admin CSS 모듈화
- ErrorBoundary에 에러 유형/메시지 표시 + 다시 시도/새로고침 버튼 추가
- admin 컴포넌트 CSS Modules 전환 (클래스명 충돌 방지)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:59:11 +09:00
eaa3319c5d feat: 에러 처리 개선 + 커스텀 확인 모달 + 관리자 테스트
- 에러 코드 기반 한국어 매핑 (8개 코드, parseError 개선)
- window.confirm → 커스텀 ConfirmDialog (다크 테마, Promise 기반)
- launch URL 파라미터 ticket → token 통일
- 관리자 테스트 27개 추가 (공지사항 12 + 다운로드 6 + 유저 9)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 16:44:04 +09:00
24cbc54a96 ci: GitHub Actions 워크플로우 추가
Node.js lint + build 자동화 (push/PR on main)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:56:56 +09:00
42567ab6e4 feat: 폼 유효성 피드백 + 모바일 반응형
폼 검증:
- RegisterPage: 아이디 실시간 검증, 비밀번호 강도, 확인 일치
- LoginPage: aria-describedby 접근성 개선

반응형:
- 768px 이하 레이아웃 최적화, 터치 타겟 44px

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:52:17 +09:00
555749b953 feat: 보안 + UX 개선
보안:
- SSAFY OAuth URL https 스킴 검증
- CSRF 방어 X-Requested-With 헤더 추가
- 업로드 에러 상태코드별 메시지 분기 (413, 409, 5xx)

UX:
- Admin 페이지 Toast 알림 통합
- API 에러 메시지 한글화 (localizeError)
- og:title, og:description 메타 태그 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 10:37:49 +09:00
1a3be5f76b fix: ESLint react-hooks 최신 규칙 호환
All checks were successful
Client CI/CD / test (push) Successful in 12s
Client CI/CD / deploy (push) Successful in 38s
- useCallback → 일반 함수 + eslint-disable (초기 데이터 fetch)
- ToastProvider: useCallback 프로퍼티 할당 → useMemo 객체 패턴
- SSAFYCallbackPage: eslint-disable-line 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 23:45:10 +09:00
790e6e4c7f ci: npm ci에 --legacy-peer-deps 추가 (ESLint peer 충돌 해결)
Some checks failed
Client CI/CD / test (push) Failing after 15s
Client CI/CD / deploy (push) Has been skipped
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 23:41:39 +09:00
285e3ae4bd ci: HEALTHCHECK 추가 + git clone 토큰 로그 노출 방지
Some checks failed
Client CI/CD / test (push) Failing after 1m3s
Client CI/CD / deploy (push) Has been skipped
- Dockerfile에 nginx HEALTHCHECK 추가 (wget, 30s 간격)
- deploy 단계 git clone에 set +x / --quiet / 2>/dev/null 적용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 20:10:02 +09:00
1335a4e929 fix: 4차 리뷰 — 중복 keyframes 제거, useEffect deps 수정
Some checks failed
Client CI/CD / test (push) Failing after 39s
Client CI/CD / deploy (push) Has been skipped
- index.css 중복 @keyframes toast-in 제거 (Toast.css에 정의)
- DownloadSection useEffect deps [] → [loadInfo]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 19:59:18 +09:00
789dad1e34 fix: 3차 리뷰 LOW — useCallback, 중복 제거, 접근성 강화
Some checks failed
Client CI/CD / test (push) Failing after 34s
Client CI/CD / deploy (push) Has been skipped
- DownloadSection loadInfo useCallback 래핑
- DownloadAdmin reload 중복 → 단일 load 함수
- LoginPage/RegisterPage 에러 메시지 role="alert"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 19:06:15 +09:00
e671a1cba6 fix: Toast @keyframes toast-in 애니메이션 정의 추가
Some checks failed
Client CI/CD / test (push) Failing after 45s
Client CI/CD / deploy (push) Has been skipped
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 18:56:50 +09:00
96f5381d1c feat: 코드 리뷰 기반 전면 개선 — 보안, 접근성, 테스트, UX
Some checks failed
Client CI/CD / test (push) Failing after 15m27s
Client CI/CD / deploy (push) Has been cancelled
- HttpOnly 쿠키 refresh token (localStorage 제거)
- 런치 티켓 방식 (JWT URL 노출 방지)
- JWT 디코드로 role 결정 (localStorage 신뢰 제거)
- apiUpload withCredentials 추가
- ErrorBoundary 컴포넌트 추가
- 404 catch-all 라우트 추가
- ARIA 접근성 (tab pattern, aria-label, aria-live)
- Toast CSS 추출 + toastId useRef
- UploadForm 별도 파일 분리 + apiUpload 함수
- UserAdmin fetchError 상태 + retry 버튼
- AuthRedirect 일관성 (모든 경로 → /login)
- DownloadSection localStorage 중복 제거
- CI lint + test + build 검증 단계 추가
- Vitest 테스트 (client 8, Register 10, Login 8)
- AuthPage.css 공유 의도 명확화

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 18:07:32 +09:00
254617530c feat: Toast 알림 시스템 + 어드민 UX 개선
All checks were successful
Client CI/CD / deploy (push) Successful in 29s
- Toast 알림 컴포넌트 추가 (success/error/warn/info)
- AnnouncementAdmin 초기 로딩 상태 + 에러 표시
- DownloadAdmin 로딩 상태 추가
- UserAdmin/AnnouncementAdmin에 Toast 피드백 적용
- API client 5xx/네트워크 에러 자동 재시도

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 03:42:20 +09:00
f93d81b6d9 fix: 입력 검증 일관성·UX 개선
All checks were successful
Client CI/CD / deploy (push) Successful in 35s
- 회원가입 username 검증을 서버와 동일하게 맞춤
- 비밀번호 maxLength를 bcrypt 제한(72)에 맞춤
- 공지사항 줄바꿈 CSS 처리 (pre→white-space)
- 어드민 페이지 에러 로깅 추가
- 다운로드 섹션 로딩 스켈레톤 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 21:40:09 +09:00
aaf92baa9f fix: 입력 검증·보안 헤더·접근성·UX 개선
All checks were successful
Client CI/CD / deploy (push) Successful in 25s
- 로그인/회원가입 입력 길이 제한 (username 50자, password 100자)
- 공지사항 관리 입력 길이 제한 (제목 200자, 내용 10000자)
- AnnouncementBoard aria-expanded 접근성 속성 추가
- DownloadSection useEffect 중복 API 호출 제거
- nginx 보안 헤더 (X-Content-Type-Options, X-Frame-Options)
- nginx /assets/ 장기 캐싱 (immutable, 1년)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 17:48:24 +09:00
97453b1d81 fix: 코드 리뷰 기반 전체 개선 — 보안, 품질, UX
All checks were successful
Client CI/CD / deploy (push) Successful in 30s
- refreshToken 중복 로직 일원화 (동시 호출 방지 포함)
- 파일 업로드 401 시 토큰 갱신 후 재시도 추가
- XHR JSON.parse 에러 보호
- index.html lang="ko", title "One of the plans" 변경
- Vite 기본 에셋(vite.svg, react.svg) 및 빈 App.css 제거
- 공지 CRUD API 레이어 분리 (AnnouncementAdmin → announcements.js)
- load 함수 useCallback 적용 및 useEffect 의존성 정상화
- 로딩/빈 목록 상태 표시 추가 (AnnouncementBoard, UserAdmin)
- 누락 CSS 정의 추가 (announcement-error, announcement-empty)
- 로그인/회원가입 빈 필드 클라이언트 검증 추가
- 공지 등록 시 빈 제목/내용 에러 피드백 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 14:38:54 +09:00
c2e3be491d feat: SSAFY OAuth 2.0 로그인 클라이언트 구현
All checks were successful
Client CI/CD / deploy (push) Successful in 34s
SSAFY 로그인 버튼 연동, 콜백 페이지 추가, AuthContext에 setUserFromSSAFY 메서드 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 23:56:06 +09:00
90e9922bde fix: 게임 시작 흐름 안정화 및 UX 개선
All checks were successful
Client CI/CD / deploy (push) Successful in 12s
- 게임 시작 전 토큰 리프레시 (만료 토큰 전달 방지)
- 토큰 null 가드 (다른 탭 로그아웃 시 로그인 유도)
- 토큰 URL 인코딩 (encodeURIComponent)
- 런처 미설치 시 힌트 강조 표시
- 게임 시작 버튼 로딩 상태 + 더블 클릭 방지
- 다운로드 정보 실패 시 재시도 버튼 추가
- 비밀번호 강도 실시간 피드백 (약함/보통/강함)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 11:11:10 +09:00
6fb7e2cbc5 fix: 보안 강화, 리프레시 토큰 도입, 연계 오류 수정
- api/client: 리프레시 토큰 자동 갱신 (401 시 재시도, 동시 요청 dedup)
- api/client: 204 No Content 처리 추가 (res.json() 크래시 방지)
- api/client: 서버 에러 메시지 body에서 파싱하여 전달
- api/auth: logout 함수 추가 (서버 세션 삭제), 미사용 refreshToken 함수 제거
- AuthContext: 로그인 시 refreshToken 저장, 로그아웃 시 서버 호출 분리
- AuthContext: 401 이벤트는 로컬 세션만 정리 (clearSession 분리)
- DownloadSection: 게임 시작 토큰을 localStorage에서 직접 읽기 (스테일 방지)
- DownloadAdmin: XHR 401 처리, Content-Type 헤더 추가
- AnnouncementAdmin: 등록/수정/삭제 에러 상태 표시 추가
- AnnouncementBoard: API 실패 시 에러 메시지 표시
- UserAdmin: 권한 변경/삭제 에러 처리 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 09:51:35 +09:00
f85e261366 fix: 런처 삭제 시 게임 시작 불가 이슈 해결
All checks were successful
Client CI/CD / deploy (push) Successful in 22s
blur 이벤트 기반 런처 감지 로직을 제거하고 런처 다운로드 버튼을
항상 노출하도록 변경. 레지스트리만 남아있고 런처 파일이 없는 경우에도
사용자가 직접 런처를 재다운로드할 수 있도록 함.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 13:49:05 +09:00
f4196f5918 docs: README, CLAUDE.md 작성
All checks were successful
Client CI/CD / deploy (push) Successful in 11s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 00:20:43 +09:00
2cb4b9419f feat: 게임 가제 'One of the plans' UI 텍스트 적용
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 00:18:13 +09:00
7e4e5a1801 feat: 런처/게임 분리 배포 구조 적용
All checks were successful
Client CI/CD / deploy (push) Successful in 12s
- 런처 미설치 시 launcher.exe만 다운로드 (게임 전체 zip 아님)
- 관리자 페이지에 런처/게임 별도 업로드 섹션 분리
- 힌트 문구 업데이트

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 23:34:17 +09:00
eb579ded5c feat: 게임 배포 관리 UI를 파일 직접 업로드 방식으로 전환
All checks were successful
Client CI/CD / deploy (push) Successful in 12s
- zip 파일 업로드 → XHR progress bar로 진행률 표시
- 업로드 후 버전·파일명·크기·해시 자동 표시
- 현재 배포 중인 빌드 정보 상단에 표시

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 23:25:14 +09:00
e496de7e56 feat: 게임 시작/다운로드 버튼 통합
All checks were successful
Client CI/CD / deploy (push) Successful in 11s
- 단일 "게임 시작" 버튼으로 통합
- 런처 설치 시 게임 실행, 미설치 시 자동 다운로드 (blur 감지)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 22:48:47 +09:00
4ec4f9a0a3 fix: UserAdmin의 useAuth import 경로 수정
All checks were successful
Client CI/CD / deploy (push) Successful in 10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 22:41:31 +09:00
80c06e814e ci: set -e 추가로 빌드 실패 시 파이프라인 중단
Some checks failed
Client CI/CD / deploy (push) Failing after 10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 22:40:54 +09:00
2163d0f311 fix: 관리자 다운로드 폼 에러 피드백 추가 및 nginx HTML 캐싱 방지
All checks were successful
Client CI/CD / deploy (push) Successful in 9s
- 저장 실패 시 에러 메시지 표시
- nginx index.html Cache-Control: no-store 설정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 22:34:45 +09:00
4047014cea feat: 다운로드 관리 페이지에 fileHash 입력 필드 추가
All checks were successful
Client CI/CD / deploy (push) Successful in 10s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 22:22:49 +09:00
6998ffd6a3 feat: 게임 시작 버튼 추가 및 AuthContext 린트 에러 수정
All checks were successful
Client CI/CD / deploy (push) Successful in 10s
- DownloadSection에 a301:// 커스텀 URI로 게임 실행하는 버튼 추가
- AuthContext에서 createContext와 useAuth 훅을 별도 파일로 분리하여 react-refresh 린트 에러 해결

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 20:55:27 +09:00
e025fdfe87 feat: JWT 만료/로그아웃 시 자동 리다이렉트 처리
All checks were successful
Client CI/CD / deploy (push) Successful in 11s
- 401 응답 시 auth:unauthorized 이벤트 발생 (client.js)
- AuthContext에서 이벤트 수신 시 자동 로그아웃
- 관리자 페이지에서 인증 만료 시 메인으로, 그 외는 로그인 페이지로 이동

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 16:38:46 +09:00
2ac2823ecc feat: 회원가입 페이지 및 API 추가
All checks were successful
Client CI/CD / deploy (push) Successful in 11s
- RegisterPage 추가 (아이디/비밀번호/비밀번호 확인 폼, 클라이언트 유효성 검사)
- /register 라우트 추가 (로그인 상태 시 홈 리다이렉트)
- 로그인 페이지에 회원가입 링크 및 가입 완료 안내 메시지 추가
- api/auth.js에 register() 함수 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 15:11:32 +09:00
1359c38222 feat: 관리자 페이지 추가 (공지사항, 다운로드, 유저 관리)
- /admin 라우트 추가 (admin 권한 전용)
- 공지사항 CRUD, 다운로드 정보 수정, 유저 권한/삭제 관리
- AuthContext에 role 추가 및 localStorage 저장
- 홈 헤더에 admin 링크 표시 (admin만 노출)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 14:52:28 +09:00
9fa665c9c0 fix: 다운로드 정보 없을 때 준비중 메시지 표시
All checks were successful
Client CI/CD / deploy (push) Successful in 12s
404 응답 시 컴포넌트가 사라지는 대신 안내 문구 노출

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-24 14:39:26 +09:00