Commit graph

379 commits

Author SHA1 Message Date
772eda21e0 docs: 코드 개선 문서 최종 업데이트
- 3.7 리스트 key 검토 완료 (정적 리스트는 index 유지, 동적은 고유 ID 사용 중)
- 품질 점수 요약 업데이트 (6/10 → 8.5/10 달성)
- 모든 Phase 완료 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 16:33:12 +09:00
a0fc67adae refactor: Low 우선순위 코드 품질 개선
- constants에 GROUP_INFO 상수 추가 (데뷔일, 팬덤명)
- PC Home에서 멤버 수 동적 계산 (API 기반)
- mobile/Layout.jsx 컴포넌트 분리 (Header.jsx, BottomNav.jsx)
- 미사용 유틸리티 함수는 관리자 페이지용으로 유지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 16:30:39 +09:00
116d41ff07 refactor: Medium 우선순위 코드 품질 개선
- API client: fetchFormData에 requireAuth 옵션 추가
- API client: HTTP 헬퍼 함수를 팩토리 함수로 통합 (api, authApi)
- useMediaQuery: 리스너 핸들러 useCallback 메모이제이션
- useCalendar: 반환 객체 useMemo 메모이제이션
- schedule.js: date.js의 extractDate/extractTime 재사용
- format.js: decodeHtmlEntities 순수 함수화 (SSR 호환)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:25:20 +09:00
21639171e1 fix(lightbox): X 버튼 이벤트 버블링 및 닫기 애니메이션 수정
- PC Lightbox X 버튼에 e.stopPropagation() 추가 (이중 닫힘 방지)
- MobileLightbox AnimatePresence 구조 수정 (exit 애니메이션 활성화)
- 모바일 앨범 상세/갤러리 페이지에 헤더 표시 (hideHeader → pageTitle)
- 문서에 MobileLightbox 컴포넌트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:21:56 +09:00
791a3d699a refactor(lightbox): MobileLightbox 공통 컴포넌트 분리
- MobileLightbox 컴포넌트 생성 (Swiper 기반 터치 스와이프)
  - 사진 정보 바텀시트 내장
  - 다운로드, 카운터, 비디오 지원
- Mobile AlbumDetail에서 MobileLightbox 사용 (-185줄)
- Mobile AlbumGallery에서 MobileLightbox 사용 (-188줄)
- 코드 중복 제거로 총 414줄 감소

라이트박스 컴포넌트 구조:
- Lightbox: PC용 (키보드/클릭 네비게이션)
- MobileLightbox: Mobile용 (Swiper 터치 스와이프)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 14:11:52 +09:00
934fbb8ed6 fix(mobile): 컨셉포토 라이트박스 정보를 바텀시트로 변경
AlbumGallery와 동일한 UX 패턴 적용:
- 사진 아래 직접 정보 표시 제거
- Info 버튼 추가 (ℹ️)
- 바텀시트로 멤버/컨셉 정보 표시
- 드래그하여 닫기 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:34:05 +09:00
6cbe4fe6e2 refactor(lightbox): PC AlbumDetail에서 공통 Lightbox 컴포넌트 사용
- 공통 Lightbox 컴포넌트에 비디오 지원 추가 (teasers prop)
- 사진 메타데이터 표시 지원 (photos prop으로 컨셉/멤버 정보)
- showCounter, showDownload props 추가
- PC AlbumDetail의 인라인 라이트박스 코드 제거 (-285줄)
- 코드 중복 제거 및 유지보수성 향상

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:31:41 +09:00
97d6148280 feat: 앨범 상세 페이지 컨셉 포토 라이트박스 개선
- PC/Mobile 앨범 상세 페이지 컨셉 포토 라이트박스에서 좌우 네비게이션 지원
- 현재 보이는 미리보기 사진 내에서만 네비게이션 (PC 4장, Mobile 6장)
- 컨셉 이름과 멤버 정보 표시 (AlbumGallery와 동일한 UX)
- lightbox state에 photos 배열 추가하여 메타데이터 관리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 13:19:36 +09:00
57d4f1dd5c refactor: High 우선순위 코드 품질 개선
- utils/youtube.js: YouTube URL 파싱 유틸리티 생성
  - getYoutubeVideoId, getYoutubeThumbnail, getYoutubeEmbedUrl
- utils/format.js: parseCredits, calculateTotalDuration 함수 추가
- hooks/useLightbox.js: 라이트박스 상태 관리 훅 생성
- components/common/ErrorMessage.jsx: 에러 메시지 컴포넌트 생성
- components/common/Loading.jsx: size prop 추가 (sm, md, lg)
- TrackDetail (PC/Mobile): 중복 함수 제거, 유틸리티 사용
- AlbumDetail (PC/Mobile): getTotalDuration -> calculateTotalDuration 유틸리티 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:40:31 +09:00
d9b8e67b9a refactor: Critical 코드 품질 개선
- useAdminAuth: useRef로 logout 함수 안정화하여 무한 루프 방지
- useAdminAuth/useRedirectIfAuthenticated: queryKey 충돌 해결
- useAuthStore: 미사용 getToken, checkAuth 메서드 제거
- useUIStore: 미사용 confirmDialog 관련 코드 제거
- 카드 컴포넌트 React.memo 적용 (PC/Mobile ScheduleCard, BirthdayCard 등)
- 접근성(a11y) 개선: aria-label, role 속성 추가
  - Toast: role="alert", aria-live="polite"
  - Lightbox: role="dialog", aria-modal, aria-label
  - Calendar: 버튼 aria-label, aria-pressed, aria-expanded
  - LightboxIndicator: aria-label, aria-current

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:33:26 +09:00
72b3800ce7 docs: frontend-refactoring.md 진행 상황 업데이트
- NotFound 페이지 완료 표시
- Phase 9-2 코드 품질 개선 단계 추가
- code-improvements.md 참조 링크 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:27:13 +09:00
0ce67d57e8 docs: 코드 품질 개선 사항 문서 추가
- code-improvements.md 생성: 전체 코드 검토 결과 정리
- Critical/High/Medium/Low 우선순위별 개선 사항 분류
- 구체적인 문제점과 해결방법 코드 예시 포함
- migration.md에서 useToast를 관리자 영역으로 이동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:22:08 +09:00
276ef509f0 feat: NotFound (404) 페이지 추가
- PC/Mobile 404 페이지 구현
- App.jsx에 catch-all 라우트 추가
- pages/common/ 폴더 구조 생성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:10:57 +09:00
9d1f54c68a refactor: 컴포넌트 폴더 구조 정리
- PC 컴포넌트를 components/pc/로 이동 (Calendar, ScheduleCard, BirthdayCard, CategoryFilter)
- Mobile 컴포넌트를 components/mobile/로 이동 (Mobile 접두사 제거)
- components/schedule/에는 공용 코드만 유지 (confetti.js, AdminScheduleCard)
- Schedule, Home 페이지의 import 경로 업데이트
- 관련 문서 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:08:47 +09:00
b49e5e277d refactor: 멤버 영어이름 하드코딩 제거, API에서 가져오도록 변경
- MEMBER_ENGLISH_NAMES 상수 제거
- Birthday 페이지에서 member.name_en 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 11:38:09 +09:00
97850b12c1 refactor: 코드 구조 개선 및 중복 제거
- 페이지 폴더 구조를 문서대로 정리 (pc/, mobile/ 하위 폴더)
- Mobile Schedule 리팩토링 (1,495줄 → 780줄, 48% 감소)
- MobileCalendar를 별도 공통 컴포넌트로 분리
- MobileBirthdayCard에 motion/delay 지원 추가
- 중복 상수 통합: CATEGORY_ID, MIN_YEAR, SEARCH_LIMIT, MEMBER_ENGLISH_NAMES
- sections/utils.js 중복 함수 제거 (@/utils에서 re-export)
- formatXDateTime 함수 개선 (datetime 문자열 직접 처리)
- 모바일 유튜브 숏츠 표시 개선 (가로 비율, 전체화면시 세로)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 11:32:43 +09:00
dd0e508117 feat: 생일 페이지 추가 (PC/Mobile)
- 멤버 생일 상세 페이지 구현
- 그라데이션 헤더 카드 (멤버 사진, 생일 정보)
- 생일카페 섹션 (준비 중 플레이스홀더)
- breadcrumb 네비게이션 (HAPPY OOO DAY 그라데이션 텍스트)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 10:32:11 +09:00
76e0c2ee72 feat(frontend-temp): Phase 10 - 앨범 목록 페이지 구현
PC 앨범 페이지:
- 앨범 목록 그리드 (4열)
- 앨범 타입별 통계 (정규/미니/싱글/총)
- 호버 시 트랙 수 표시
- 타이틀곡 및 발매일 표시

Mobile 앨범 페이지:
- 앨범 목록 그리드 (2열)
- 앨범 타입 및 발매년도 표시

Note: 앨범 상세 페이지(AlbumDetail, AlbumGallery)는 추후 구현 예정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 09:23:24 +09:00
7a076aaffd feat(frontend-temp): Phase 9 - 스케줄 페이지 구현
PC 스케줄 페이지:
- Calendar 컴포넌트 (년/월 선택, 날짜 선택, 일정 점 표시)
- CategoryFilter 컴포넌트 (카테고리별 필터링)
- 검색 기능 (무한 스크롤 + 가상 스크롤 + 자동완성)
- 생일 폭죽 애니메이션

Mobile 스케줄 페이지:
- 달력 뷰 / 리스트 뷰 전환
- 월 선택 드롭다운
- 검색 기능 (무한 스크롤)
- 날짜별 그룹화된 일정 목록

공통 컴포넌트:
- BirthdayCard (PC/Mobile)
- fireBirthdayConfetti 함수

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 09:08:30 +09:00
2ead24065b refactor(frontend-temp): schedules.js에서 dayjs 활용
- datetime 파싱에 dayjs 사용
- utils/date.js에서 timezone 설정된 dayjs import

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 09:01:24 +09:00
4dcd79504d chore: docs 파일 정리 및 불필요한 파일 삭제
- docs/refactoring.md → docs/backend-refactoring.md 이름 변경
- frontend-temp/package-lock.json 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:49:46 +09:00
b64710c8fd refactor(frontend-temp): 스케줄 API도 새 형식에 맞게 업데이트
- flattenScheduleResponse → transformSchedule 함수로 변경
- 새 API 형식(schedules 배열, datetime, category 객체) 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 00:45:55 +09:00
3922d5c6f7 refactor(frontend): 관리자 일정 API도 새 형식에 맞게 업데이트
- admin/schedules.js에 transformSchedule 함수 추가
- AdminSchedule.jsx의 검색 로직을 schedulesApi.searchSchedules 사용으로 변경
- 직접 fetch 호출 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:35:17 +09:00
55096c8e43 refactor(frontend): API 레이어에 데이터 변환 로직 통합
- schedules.js에 transformSchedule 함수 추가
  - datetime → date, time 분리
  - category 객체 → category_id, category_name, category_color 플랫화
  - members 배열 → member_names 문자열 변환
- PC Schedule.jsx의 검색 로직을 searchSchedules 함수 사용으로 변경
- 중복 변환 로직 제거로 코드 간소화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:33:32 +09:00
e136f3c74b fix(backend): 검색 결과에서 _rankingScore 제거 및 CORS 설정 추가
변경 사항:
- 검색 API 응답에서 _rankingScore 필드 제거
- @fastify/cors 패키지 추가
- docs.caadiq.co.kr에서 API 테스트 요청 허용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:21:24 +09:00
51063a120a refactor(backend): 일정 API 공통 포맷팅 함수로 리팩토링
공통 함수 추가:
- normalizeDate(): 날짜 문자열 정규화
- buildDatetime(): datetime 문자열 생성
- buildSource(): source 객체 생성
- formatSchedule(): 단일 일정 포맷팅
- formatSchedules(): 일정 목록 포맷팅
- buildMemberMap(): 멤버 맵 조회

변경:
- getMonthlySchedules: 공통 함수 사용
- getUpcomingSchedules: 공통 함수 사용
- meilisearch/formatScheduleResponse: buildDatetime 공통 함수 사용

SQL 쿼리도 SCHEDULE_LIST_SQL 상수로 통합

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:18:48 +09:00
22ce21f908 refactor(backend): 일정 API 응답 형식을 검색 API와 통일
변경 사항:
- getMonthlySchedules: 날짜별 그룹화 → 플랫 배열
- getUpcomingSchedules: 날짜별 그룹화 → 플랫 배열

새 형식:
{
  "schedules": [
    {
      "id": 123,
      "title": "...",
      "datetime": "2025-01-21T19:00:00",
      "category": { "id": 1, "name": "...", "color": "#..." },
      "source": { "name": "...", "url": "..." },
      "members": ["name1", "name2"]
    }
  ]
}

주요 변경:
- date/time 분리 → datetime 통합
- members: [{ name: "..." }] → ["name1", "name2"]
- categories 카운트 제거
- _rankingScore 없음 (검색 API에만 존재)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:47:40 +09:00
0255b35616 feat(frontend): 일정 카드 컴포넌트 5종 생성
PC 카드 (2종):
- ScheduleCard: 일반 일정 카드 (홈, 스케줄 페이지)
- AdminScheduleCard: 관리자 일정 카드 (편집/삭제 버튼 포함)

Mobile 카드 (3종):
- MobileScheduleCard: 홈 페이지용 (간결한 레이아웃)
- MobileScheduleListCard: 스케줄 타임라인용 (날짜 없이 시간/카테고리)
- MobileScheduleSearchCard: 검색 결과용 (왼쪽에 날짜 표시)

공통 변경:
- decodeHtmlEntities를 사용하여 HTML 엔티티 디코딩
- getDisplayMembers 유틸 추가 (5명 이상일 때 프로미스나인 표시)
- getMemberList가 member_names 문자열 처리하도록 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:40:07 +09:00
9b96c475a7 refactor(frontend): 일정 카드를 공유 컴포넌트로 분리
- ScheduleCard (PC): 카테고리와 source name 분리, Link2 아이콘 사용
- MobileScheduleCard (Mobile): 동일한 구조로 분리
- Home 페이지에서 컴포넌트 사용하도록 변경
- 멤버 5명 이상이면 '프로미스나인'으로 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:31:28 +09:00
d660340cc5 fix(frontend): getUpcomingSchedules에 flattenScheduleResponse 적용
- 백엔드 응답(날짜별 그룹 객체)을 배열로 변환
- 필드명 snake_case 통일 (category_id, category_name, category_color)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:24:51 +09:00
6a6f45798a fix(frontend): hooks/index.js에 useMembers, useAlbums export 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:23:47 +09:00
8ec7aa0e60 feat(frontend): Phase 8 - 멤버 페이지 구현
- PC 멤버 페이지: 5열 그리드, 전 멤버 섹션 (grayscale)
- Mobile 멤버 페이지: Swiper 카드 스타일, 썸네일 인디케이터
- App.jsx에 멤버 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:20:17 +09:00
edde52b06e feat(frontend): Phase 7 - 홈 페이지 및 App.jsx 구현
- PC/Mobile 홈 페이지 분리 구현
- App.jsx: react-device-detect (BrowserView/MobileView) 사용
- PCWrapper: body.is-pc 클래스 추가
- 커스텀 훅 사용 (useMembers, useAlbums, useUpcomingSchedules)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:18:15 +09:00
86bf2359f2 feat(frontend): Phase 6 - 공통 컴포넌트 및 레이아웃 구현
- 공통 컴포넌트: Loading, ErrorBoundary, Toast, Tooltip, ScrollToTop, Lightbox
- PC 레이아웃: Layout, Header, Footer
- Mobile 레이아웃: Layout (Header + BottomNav 통합)
- CSS: pc.css, mobile.css (디바이스별 스타일)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:16:09 +09:00
2d42bf1603 revert(frontend): Phase 5로 롤백 - 구조 재설계
Phase 6-9에서 추가된 파일 제거
- react-device-detect 미사용 문제로 인한 구조 재설계
- 올바른 폴더 구조로 재시작 예정:
  - pages/{feature}/pc/, pages/{feature}/mobile/ 구조
  - react-device-detect BrowserView/MobileView 사용
  - components/pc/, components/mobile/ 레이아웃 분리

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:11:21 +09:00
e0ab3ce0f8 fix(backend): getUpcomingSchedules 응답 형식 통일
- getUpcomingSchedules가 getMonthlySchedules와 동일한 날짜별 그룹화 형식 반환
- routes/schedules 응답 스키마에 oneOf 추가 (객체/배열 둘 다 허용)
- docs/architecture.md, migration.md 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 20:10:26 +09:00
bd8e87f636 feat(frontend): Phase 9 - 기타 공개 페이지 마이그레이션
페이지 추가:
- Home: PC/Mobile 통합 홈 페이지
  - 히어로 섹션, 그룹 통계, 멤버/앨범/일정 미리보기
- Members: PC/Mobile 통합 멤버 페이지
  - 현재 멤버, 전 멤버 그리드
- NotFound: 404 페이지

훅 추가:
- useMembers: 멤버 목록 조회
- useMemberDetail: 멤버 상세 조회

라우팅:
- 모든 공개 라우트 완성 (/, /members, /album, /schedule)
- 404 라우트 추가 (*)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 18:07:55 +09:00
6c25d32259 fix(frontend): useAlbumData albumApi import 수정
- albumsApi → albumApi로 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 18:05:14 +09:00
5e03e48be5 feat(frontend): Phase 8 - 앨범 페이지 마이그레이션
앨범 페이지:
- Album.jsx: PC/Mobile 통합 (useIsMobile 분기)
- PC: 통계 + 4열 그리드 + 호버 오버레이
- Mobile: 2열 그리드 간소화

훅 추가:
- useAlbums: 앨범 목록 조회
- useAlbumDetail: 앨범 상세 조회
- useAlbumGallery: 앨범 갤러리 조회

라우팅:
- /album 라우트 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 18:03:06 +09:00
81b78be010 fix(frontend): useCalendar 및 Schedule 날짜 처리 버그 수정
- useCalendar: initialDate가 문자열일 경우 Date 객체로 변환
- useCalendar: days 배열 추가 (캘린더 날짜 목록)
- useCalendar: canGoPrev 별칭 추가
- Schedule: currentDate가 Date 객체가 아닐 경우 안전하게 변환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 18:01:09 +09:00
64fc07044d feat(frontend): Phase 7 - 레이아웃 및 스케줄 페이지 마이그레이션
레이아웃 컴포넌트:
- Header: PC용 헤더 (네비게이션 + SNS 링크)
- MobileNav: 모바일 하단 네비게이션
- Footer: PC용 푸터
- Layout: PC/Mobile 통합 레이아웃 (useIsMobile 기반 분기)

스케줄 페이지 (기본 구조):
- PC: 좌측 캘린더 + 우측 일정 목록
- Mobile: 상단 네비게이션 + 일정 목록
- 월 변경, 날짜 선택, 일정 표시 기능

App.jsx 업데이트:
- 라우팅 설정 (/, /schedule, /members, /album)
- Layout 컴포넌트 적용

상수 추가:
- NAV_ITEMS: 네비게이션 메뉴 항목

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:54:27 +09:00
84030019cd feat(frontend): Phase 6 - 공통 컴포넌트 구현
- ErrorBoundary: 에러 경계 컴포넌트
- Loading: 로딩 스피너 (sm/md/lg, FullPageLoading, InlineLoading)
- Toast, ToastContainer: 토스트 알림 (useUIStore 연동)
- Lightbox: 이미지 라이트박스 (키보드 네비게이션)
- ScheduleCard: 스케줄 카드 (public/admin variant)
  - public: 공개 페이지용 카드 스타일
  - admin: 관리자 페이지용 리스트 스타일 (수정/삭제 버튼 포함)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:39:48 +09:00
27c41b0af0 feat(frontend): Phase 5 - 커스텀 훅 구현
- useMediaQuery, useIsMobile, useIsDesktop: 반응형 레이아웃
- useScheduleData, useCategories: 스케줄/카테고리 데이터 조회
- useScheduleSearch: 무한 스크롤 검색
- useScheduleFiltering, useCategoryCounts: 필터링 및 정렬
- useCalendar: 캘린더 로직 (월 이동, 날짜 선택)
- useAdminAuth: 토큰 검증 및 리다이렉트
- utils/schedule.js: 스케줄 유틸리티 함수 추가
- constants: SEARCH_LIMIT, MIN_YEAR, MONTH_NAMES 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:22:38 +09:00
fe067ca8c8 feat(frontend): Phase 4 - API 계층 구현
- api/client.js: fetch 래퍼, ApiError, 헬퍼 함수 (get/post/put/del)
- api/auth.js: 로그인, 토큰 검증
- api/schedules.js: 스케줄/카테고리 API (공개 + 어드민)
- api/albums.js: 앨범 API (공개 + 어드민)
- api/members.js: 멤버 API (공개 + 어드민)
- docs: useQuery 사용 가이드라인 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:17:56 +09:00
cba7e4b522 feat(frontend): Phase 3 - Zustand 스토어 구현
- useAuthStore: 인증 상태 관리 (localStorage persist)
- useScheduleStore: 스케줄 페이지 상태 (검색, 필터, 날짜, 뷰)
- useUIStore: UI 상태 (토스트, 모달, 라이트박스, 확인 다이얼로그)
- stores/index.js: 통합 export

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:11:00 +09:00
dc63a91f4f feat(frontend): Phase 2 - 유틸리티 및 상수 정의
- constants/index.js: 카테고리, SNS 링크, 앨범 타입, 타임존 상수
- utils/cn.js: clsx 기반 className 유틸리티
- utils/date.js: dayjs 기반 날짜 유틸리티 (KST)
- utils/format.js: HTML 디코딩, 숫자/시간 포맷팅
- utils/index.js: 통합 export

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:07:56 +09:00
4ec368c936 feat(frontend): Phase 1 - 리팩토링을 위한 frontend-temp 프로젝트 셋업
- frontend-temp/ 폴더 생성 (Strangler Fig Pattern)
- package.json: clsx 추가, 버전 2.0.0
- vite.config.js: @ path alias 추가
- 기본 폴더 구조 생성 (api, components, hooks, pages, stores, utils, constants)
- docker-compose.yml: fromis9-frontend-dev 서비스 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 17:04:18 +09:00
9d365dcadb fix(frontend): 멤버 표시 오류 수정 및 생일 우선 정렬 추가
수정:
- AdminSchedule.jsx 1306번 라인 멤버 처리 오류 수정
- getMemberList 헬퍼 함수 사용으로 통일

생일 우선 정렬:
- PC 공개 일정 페이지: filteredSchedules에 생일 우선 정렬 추가
- PC 관리 페이지: filteredSchedules에 생일 우선 정렬 추가
- 모바일 공개 페이지: groupedSchedules, selectedDateSchedules에 생일 우선 정렬 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:26:17 +09:00
b4c393c20a fix(frontend): 검색 결과 멤버 표시 오류 수정
- getMemberList 헬퍼 함수 추가 (검색 결과/일반 데이터 모두 처리)
- 검색 결과의 members가 문자열 배열인 경우 처리
- AdminSchedule.jsx trim() 오류 수정

수정 파일:
- pc/public/Schedule.jsx
- pc/admin/AdminSchedule.jsx
- mobile/public/Schedule.jsx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:22:44 +09:00
3ee41beb46 feat(backend): Redis 캐시 확대 - 카테고리, 앨범 목록/상세 캐싱
캐시 적용:
- 카테고리 목록: 1시간 TTL
- 앨범 목록: 10분 TTL
- 앨범 상세: 10분 TTL

캐시 무효화:
- 앨범 생성/수정/삭제 시 자동 무효화
- invalidateAlbumCache 함수 추가

utils/cache.js:
- TTL 상수 추가 (SHORT, MEDIUM, LONG, VERY_LONG)
- 앨범 관련 캐시 키 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:16:09 +09:00