Commit graph

433 commits

Author SHA1 Message Date
eae56df146 곡 상세 페이지에서 다른 곡 선택 시 히스토리 교체
- 수록곡 목록에서 다른 곡 클릭 시 replace 옵션 사용
- 뒤로가기 시 앨범 상세 페이지로 바로 이동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:56:47 +09:00
5415893f9d 트랙 영상 타입 구분 기능 추가
- DB: music_video_url을 video_url로 변경, video_type 컬럼 추가
- 백엔드: insertTracks에서 video_url, video_type 처리
- 관리자: 영상 타입 선택 드롭다운 추가 (뮤직비디오/스페셜 영상)
- CustomSelect: {value, label} 객체 옵션 및 size prop 지원
- 트랙 상세: video_type에 따른 라벨 동적 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:56:12 +09:00
0c6d250a9d feat: 모바일 곡 상세 페이지 애니메이션 개선
- 앨범 상세 페이지와 동일한 순차 애니메이션 적용
- 툴바 제목 "곡 상세" → "앨범"으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:38:37 +09:00
821ff64bad refactor: 모바일 UI 개선
- 멤버 페이지: 바텀시트를 가운데 다이얼로그로 변경, 닫기 버튼 추가
- 앨범 상세: 섹션별 순차 애니메이션, 앨범 소개 다이얼로그로 변경
- 앨범 갤러리: 헤더 뒤로가기 버튼/클릭 기능 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:36:27 +09:00
89e346d2c6 fix: X 일정 상세 UI 개선
- 닉네임과 @id 사이 간격 축소 (PC/모바일)
- 모바일 툴바에서 뒤로가기 버튼 제거, 타이틀 가운데 정렬

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:15:15 +09:00
87a69c0cbd refactor: API 응답에서 datetime을 date와 time으로 분리
- datetime 필드를 date와 time 필드로 분리하여 00:00 시간도 정상 표시되도록 수정
- 백엔드: formatSchedule, Meilisearch 검색 결과, 스키마 업데이트
- 프론트엔드: datetime 파싱 로직 제거, date/time 직접 사용
- 문서: API 응답 예시 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:11:02 +09:00
5fa9c2a9d0 feat: 모바일 멤버 페이지 그리드 레이아웃으로 리디자인
- 카드 스와이프에서 2열 그리드 레이아웃으로 변경
- 현재 멤버와 전 멤버 섹션 분리
- 멤버 선택 시 드래그 가능한 바텀 시트 다이얼로그
- AnimatePresence로 열기/닫기 애니메이션 추가
- 그리드에서 image_medium, 다이얼로그에서 image_thumb 사용
- 디자인 비교용 미리보기 페이지 추가 (/members-preview)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 09:54:01 +09:00
8bc09e7c0d docs: 문서 업데이트 및 improvements.md 삭제
- improvements.md: 모든 개선 작업 완료로 삭제
- api.md:
  - 로그인 Rate Limit 정보 추가
  - 봇 API에 last_sync_duration, version 필드 추가
  - 타임스탬프 KST 형식으로 업데이트
- architecture.md: backend/utils 폴더 구조 추가
- development.md: Redis KEYS → SCAN 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 22:06:25 +09:00
bdd2dfcd84 feat: 성능 최적화 (Phase 4)
- cache.js: Redis KEYS → SCAN으로 변경 (블로킹 방지)
- suggestions.js: 동기식 파일 I/O → 비동기 변경
  - readFileSync → readFile (fs/promises)
  - writeFileSync → writeFile (fs/promises)
- improvements.md: Phase 4 완료로 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 22:04:27 +09:00
85f03cb2d8 타임스탬프 KST 통일 및 Meilisearch 동기화 소요 시간 추가
- date.js: nowKST() 함수 추가
- 모든 타임스탬프를 UTC에서 KST(+09:00)로 변경
  - scheduler.js, bots.js, x/index.js, logger.js, app.js
- Meilisearch 봇에 동기화 소요 시간(ms) 추적 추가
- BotCard.jsx: 중복된 마지막 동기화 대신 소요 시간 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 22:00:58 +09:00
95285634e9 cron 스케줄러 한국 시간대 적용 및 봇 카드 UI 개선
- scheduler.js: cron.schedule에 timezone: 'Asia/Seoul' 옵션 추가
- bots.js: Meilisearch 봇 API에 버전 정보 추가
- BotCard.jsx: Meilisearch 봇 카드에 마지막 동기화 시간, 동기화 수, 버전 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 21:52:01 +09:00
8091f4ac67 feat: Meilisearch 버전 체크 기반 자동 동기화
- 4시~4시 5분간 1분 간격으로 Meilisearch 버전 체크
- watchtower 업데이트로 버전 변경 감지 시 즉시 동기화
- 동기화 오류 시 인덱스 삭제 후 재생성하여 재시도
- 기존 고정 시간(4:05) cron 방식에서 버전 감지 방식으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 21:41:05 +09:00
52a655bf76 feat: 외부 서비스 안정성 개선 (Phase 3)
- Nitter 요청에 10초 타임아웃 및 HTTP 상태 코드 검증 추가
- Meilisearch syncAllSchedules에서 불필요한 deleteAllDocuments 제거
  - addDocuments는 같은 ID면 자동 업데이트(upsert)
- 일정 삭제 시 Meilisearch 동기화 코드 정리 (동적 import 제거)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 21:01:35 +09:00
e852f215a3 feat: 보안 강화 및 인증 개선 (Phase 2)
- 로그인 Rate Limit 추가 (5회/분, 마지막 시도 기준 리셋)
- Multipart JSON 파싱 에러 처리 추가
- 로그아웃 시 무한 리다이렉트 버그 수정
- 인증 라우트 가드(RequireAuth) 추가로 비로그인 접근 차단
- Zustand hydration 대기로 페이지 깜빡임 해결
- admin/public 라우트 조건부 렌더링으로 경로 매칭 경고 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 20:47:05 +09:00
4edef16310 fix: 일정 저장/삭제에 트랜잭션 적용
- youtube/index.js: saveVideo에 withTransaction 적용
- x/index.js: saveTweet, saveYoutubeFromTweet에 withTransaction 적용
- schedules/index.js: DELETE 핸들러에 withTransaction 적용
- 중간 실패 시 자동 롤백으로 데이터 무결성 보장
- docs/improvements.md 문서 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 20:21:56 +09:00
d29c966ae0 docs: 문서 업데이트 및 code-review.md 삭제
- architecture.md: routes/ 폴더 구조 추가
- development.md: API 클라이언트 헬퍼 사용법 추가
- code-review.md: 모든 작업 완료로 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:40:59 +09:00
bd7fbea082 refactor: API 클라이언트 레거시 export 삭제
마이그레이션 완료로 더 이상 사용되지 않는 개별 export 제거
- get, post, put, del
- authGet, authPost, authPut, authDel

현재 방식: api.get(), authApi.post() 등

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:35:33 +09:00
a151694630 refactor: App.jsx 라우트 분리
라우트를 플랫폼/영역별로 분리하여 관리 용이성 향상
- routes/pc/public/index.jsx: PC 공개 라우트
- routes/pc/admin/index.jsx: PC 관리자 라우트
- routes/mobile/index.jsx: Mobile 라우트
- App.jsx: 194줄 → 47줄로 간소화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:34:28 +09:00
607457790d fix: 어드민 하위 페이지 스크롤 문제 수정
일정 목록 페이지(/admin/schedule)만 내부 스크롤 처리하도록 변경하여
봇 관리, 사전 관리, 일정 추가 등 하위 페이지에서 스크롤이 정상 작동하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 13:04:01 +09:00
1c9b30b783 에러 유틸리티 함수를 모든 라우트에 적용
utils/error.js에 정의된 헬퍼 함수들(badRequest, unauthorized, notFound,
conflict, serverError)을 전체 라우트 파일에 적용하여 에러 응답 처리 일관성 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 11:24:42 +09:00
897bdc471c feat: Meilisearch 동기화 봇 추가
- 매일 새벽 4시 5분 자동 재색인 (Watchtower 업데이트 후)
- 봇 관리 페이지에서 수동 동기화 및 시작/정지 가능
- bots.js에 meilisearch 타입 봇 설정 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 11:14:17 +09:00
b8137935c2 refactor: 보안 강화 및 앨범 삭제 로직 개선
- JWT_SECRET 환경변수 필수화 (기본값 제거)
- 앨범 삭제 시 S3 파일(사진, 티저, 비디오) 함께 삭제
- 앨범 삭제 시 관련 DB 테이블 정리 (album_photo_members, album_photos, album_teasers)
- Meilisearch latest 태그로 변경 (v1.6 → latest)
- 코드 리뷰 문서 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 11:00:17 +09:00
980ae3fe1d refactor: frontend-temp를 frontend로 대체 및 문서 업데이트
- frontend 폴더를 새로 리팩토링된 frontend-temp로 교체
- docs/architecture.md: 현재 프로젝트 구조 반영
- docs/development.md: API 클라이언트 구조 업데이트
- docs/frontend-improvement.md 삭제 (완료된 개선 계획)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:29:30 +09:00
218b825878 refactor: 일정 관리 컴포넌트 분리 (Phase 3)
- AnimatedNumber 공통 컴포넌트 추출 (32줄)
- BotCard 컴포넌트 분리 + XIcon, MeilisearchIcon 포함 (233줄)
- CategoryFormModal 컴포넌트 분리 (195줄)
- ScheduleBots.jsx: 570줄 → 339줄 (231줄 감소)
- ScheduleCategory.jsx: 441줄 → 289줄 (152줄 감소)
- 문서 업데이트: 개선 결과 테이블 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:21:06 +09:00
08d704da5c refactor: useScheduleSearch 훅 분리 - 검색 로직 캡슐화
- useScheduleSearch.js 생성 (217줄)
  - 검색어 자동완성 API 호출 (debounce)
  - 무한 스크롤 검색 결과 (useInfiniteQuery)
  - 키보드 네비게이션 핸들러
- Schedules.jsx: 1139줄 → 1009줄 (130줄 감소)
  - 검색 관련 상태/로직을 훅으로 이동
  - 컴포넌트 복잡도 감소

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:00:50 +09:00
81a2112b59 refactor: 색상 유틸리티 통합 - colorMap/getColorStyle 중복 제거
- utils/color.js 생성 (COLOR_MAP, COLOR_OPTIONS, getColorStyle)
- Schedules.jsx: 1159줄 → 1139줄 (20줄 감소)
- ScheduleForm.jsx: 765줄 → 743줄 (22줄 감소)
- ScheduleCategory.jsx: 466줄 → 441줄 (25줄 감소)
- 3개 파일에서 중복 코드 제거, 공통 유틸리티 import로 교체

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:30:18 +09:00
d2f6670795 docs: 일정 관리 페이지 개선 계획 문서 작성
- 5개 파일 분석 (Schedules, ScheduleForm, ScheduleDict, ScheduleBots, ScheduleCategory)
- 공통 코드 중복 문제 정리 (colorMap/getColorStyle)
- 파일별 개선 사항 및 우선순위 정리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 09:28:09 +09:00
ecd988aa8a fix: AlbumPhotos.jsx에서 미사용 useNavigate 제거
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:48:59 +09:00
cf8cdb7ec6 refactor: AlbumPhotos.jsx 분리 - 4개 컴포넌트 추출
- PendingFileItem.jsx 추출 (업로드 대기 파일 아이템)
- BulkEditPanel.jsx 추출 (일괄 편집 도구 + parseRange 함수)
- PhotoGrid.jsx 추출 (컨셉 포토/티저 그리드)
- PhotoPreviewModal.jsx 추출 (이미지/비디오 미리보기)
- AlbumPhotos.jsx: 1536줄 → 1033줄 (503줄 감소)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:46:52 +09:00
f436cf4367 refactor: AlbumForm.jsx 분리 - CustomSelect, TrackItem 컴포넌트 추출
- CustomSelect.jsx 추출 → common/ (재사용 가능한 드롭다운)
- TrackItem.jsx 추출 → album/ (트랙 입력 폼)
- AlbumForm.jsx: 631줄 → 443줄 (188줄 감소)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:39:44 +09:00
e31cb82649 refactor: ScheduleDict.jsx 분리 - WordItem 컴포넌트 추출
- WordItem.jsx 컴포넌트 추출 (단어 테이블 행 + 품사 드롭다운)
- POS_TAGS 상수 분리하여 export
- ScheduleDict.jsx: 714줄 → 572줄 (142줄 감소)
- 일정 관련 대형 파일 분리 완료

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:31:58 +09:00
cbce382d94 refactor: Schedules.jsx, ScheduleForm.jsx 대형 파일 분리
Phase 2 대형 파일 분리 작업:

Schedules.jsx (1465줄 → 1159줄, 306줄 감소)
- ScheduleItem.jsx 컴포넌트 추출
- 검색 모드와 일반 모드에서 공통 사용

ScheduleForm.jsx (1047줄 → 765줄, 282줄 감소)
- LocationSearchDialog.jsx 추출 (장소 검색 모달)
- MemberSelector.jsx 추출 (멤버 선택 UI)
- ImageUploader.jsx 추출 (이미지 업로드)

새 컴포넌트 (components/pc/admin/schedule/):
- ScheduleItem.jsx
- LocationSearchDialog.jsx
- MemberSelector.jsx
- ImageUploader.jsx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:28:57 +09:00
cfd14e01e5 fix: YouTubeEditForm 일정 없을 때 에러 UI 추가
- 존재하지 않는 일정 ID 접근 시 빈 화면 대신 에러 UI 표시
- 이전 페이지/일정 목록 이동 버튼 제공

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:06:54 +09:00
5f9f9789aa feat: 관리자 404 에러 페이지 추가
- pages/pc/admin/common/NotFound.jsx 생성
- AdminLayout 사용, 대시보드 이동 버튼 포함
- App.jsx에 /admin/* catch-all 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 23:03:18 +09:00
6a96b8a5f9 refactor: CATEGORY_ID 하드코딩 제거 및 봇 관리 페이지 애니메이션 추가
- constants/index.js에서 CATEGORY_ID 상수 삭제
- 카테고리 API 데이터의 name으로 비교하도록 변경 (유튜브, X)
- 봇 관리 페이지에 stagger 애니메이션 및 AnimatedNumber 추가
- admin/schedules API 경로 수정 (/admin/schedules/:id → /schedules/:id)
- authApi export 누락 수정
- 문서 업데이트 (Phase 1 완료, 관리자 에러 페이지 추가 예정)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 22:04:37 +09:00
362182fb53 fix: 사용 중인 hooks 복원
실제로 사용 중인 hooks를 잘못 삭제함:
- useMemberData.js (useMembers, useMemberDetail)
- useAlbumData.js (useAlbums, useAlbumDetail, useAlbumGallery)
- useScheduleData.js (useScheduleData, useScheduleDetail, useUpcomingSchedules, useCategories)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:44:14 +09:00
27fc26ee96 refactor: 컴포넌트 폴더 구조화
변경 전:
components/
├── pc/admin/ (플랫)
├── pc/public/ (플랫)
└── mobile/ (플랫)

변경 후:
components/
├── pc/admin/
│   ├── layout/ (Layout, Header)
│   ├── common/ (ConfirmDialog, DatePicker, TimePicker, NumberPicker)
│   └── schedule/ (AdminScheduleCard, CategorySelector)
├── pc/public/
│   ├── layout/ (Layout, Header, Footer)
│   └── schedule/ (Calendar, ScheduleCard, BirthdayCard, CategoryFilter)
└── mobile/
    ├── layout/ (Layout, Header, BottomNav)
    └── schedule/ (Calendar, ScheduleCard 등)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:41:44 +09:00
d5c54db86c refactor: API 폴더 구조 개선
변경 전:
api/
├── common/client.js
├── pc/admin/
├── pc/common/
└── pc/public/

변경 후:
api/
├── client.js
├── admin/
└── public/

- PC/Mobile 구분 제거 (같은 API 사용)
- 모든 import 경로 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:39:01 +09:00
21dde0fd35 refactor: 미사용 코드 제거
삭제된 함수:
- format.js: formatNumber, formatViewCount, formatFileSize, formatDuration, truncateText
- date.js: nowKST, parseDateKST, isPast, isFuture

삭제된 상수:
- constants: DEFAULT_PAGE_SIZE, API_BASE_URL

삭제된 hooks (8개, 모두 미사용):
- useAlbumData, useCalendar, useLightbox, useMediaQuery
- useMemberData, useScheduleData, useScheduleFiltering, useScheduleSearch

삭제된 stores:
- useUIStore (미사용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:37:09 +09:00
b314b70014 refactor: 프론트엔드 개선 계획 수립
- 기존 마이그레이션 문서 삭제 (admin-migration.md, frontend-refactoring.md, migration.md)
- 새로운 개선 계획서 작성 (frontend-improvement.md)
- constants 정리: CATEGORY_NAMES, ALBUM_TYPES, 불필요한 SNS 링크 삭제
- schedule.js: getMemberList에서 쉼표 구분 로직 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:30:28 +09:00
25d74d098d fix: 일정 폼 구조 수정
- CategorySelector를 components/pc/admin/schedule/로 이동
- YouTube 수정 라우트 수정: /admin/schedule/:id/edit/youtube

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:15:32 +09:00
1d5626568a feat: 일정 추가 폼 카테고리별 분기 마이그레이션
- form/index.jsx: 카테고리 선택 메인 페이지
- form/YouTubeForm.jsx: YouTube URL 기반 일정 추가
- form/XForm.jsx: X 게시글 ID 기반 일정 추가
- form/components/CategorySelector.jsx: 카테고리 선택기
- edit/YouTubeEditForm.jsx: YouTube 일정 수정 폼
- App.jsx 라우트 업데이트
  - /admin/schedule/new → 새로운 카테고리 선택 폼
  - /admin/schedule/new-legacy → 기존 레거시 폼
  - /admin/schedule/youtube/:id/edit → YouTube 수정 폼

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 21:11:59 +09:00
2a50a07a29 fix: Meilisearch 검색 결과에서도 전체 멤버 '프로미스나인' 처리
- searchSchedules: 검색 시 현재 활동 멤버 수 캐시
- formatScheduleResponse: 전체 멤버인 경우 '프로미스나인'으로 대체
- syncAllSchedules: 동기화 시 탈퇴 멤버 제외, 멤버 수 캐시 갱신

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:56:38 +09:00
9515db712d feat: 전체 멤버인 경우 '프로미스나인'으로 표시
- 백엔드: buildMemberMap, getScheduleDetail 함수에서 현재 활동 멤버 전원인 경우
  "프로미스나인"으로 대체하여 반환
- 프론트엔드: getDisplayMembers 함수에서 멤버 수 계산 로직 제거 (백엔드에서 처리)
- 탈퇴 멤버(is_former=1) 제외하고 현재 활동 멤버만 계산

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:42:05 +09:00
ff5c168529 docs: admin-migration.md 5단계 일정 관리 완료 체크
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:36:16 +09:00
7dc3ec692e feat: 관리자 페이지 마이그레이션 완료 (Phase 4-5)
- 관리자 페이지 폴더 구조 재구성 (pages/pc/admin/)
  - login/, dashboard/, members/, albums/, schedules/
- 앨범 관리 페이지 마이그레이션 (Albums, AlbumForm, AlbumPhotos, AlbumTeasers)
- 일정 관리 페이지 마이그레이션 (Schedules, ScheduleForm, ScheduleCategory, ScheduleDict, ScheduleBots)
- DatePicker 컴포넌트 버그 수정 (월 이동 및 연도 선택)
- 일정 관리 라우트 경로 수정 (/admin/schedule)
- 마이그레이션 문서 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 20:35:05 +09:00
dc5ac97717 style: ScheduleDetail 페이지 애니메이션 개선
- 로딩 스피너 제거
- 딜레이 및 부드러운 easing 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 19:07:41 +09:00
66fef502ff style: MemberEdit 페이지 애니메이션 부드럽게 개선
- spring 애니메이션 적용
- scale 애니메이션 추가
- 더 부드러운 전환 효과

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 19:06:55 +09:00
f64f6cee00 feat: 관리자 간단한 페이지 마이그레이션 (Phase 3)
- AdminDashboard 페이지 추가
- AdminMembers 페이지 추가
- AdminMemberEdit 페이지 추가
- useToast 훅 추가
- App.jsx에 관리자 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 19:03:21 +09:00
d9ea716089 Revert "fix: 태블릿에서 PC 뷰 표시되도록 변경"
This reverts commit 28d408ace5.
2026-01-22 18:59:48 +09:00