- api/schedules, albums, members → api/public/로 이동
- pages/pc/*.jsx → pages/pc/public/로 이동
- pages/mobile/*.jsx → pages/mobile/public/로 이동
- App.jsx 라우터 경로 수정
- 모든 public 페이지의 import 경로 수정
- api/ 디렉토리 구조 생성
- index.js: 공통 fetch 래퍼
- schedules.js, albums.js, members.js: 공개 API
- admin/: 어드민 API (bots, albums, categories, members, schedules)
- Schedule.jsx: API 모듈 적용
- AdminScheduleBots.jsx: API 모듈 적용
- registerBot, unregisterBot, isBotRunning에서 botId를 parseInt()로 정수 변환
- URL 파라미터(문자열)와 DB 조회 결과(숫자) 간 타입 일치 문제 해결
- 10초 상태 동기화에서 메모리 스케줄러를 찾지 못해 stopped로 변경되던 버그 수정
- filteredSchedules useMemo로 불필요한 재계산 방지
- ScheduleItem React.memo 컴포넌트로 분리하여 리렌더링 방지
- categoryCounts useMemo 맵으로 O(1) 카테고리 카운트 조회
- 카테고리 카운트를 선택된 날짜 기준으로 계산
- useDeferredValue로 달력 점 표시 지연 처리하여 UI 응답성 향상
- selectedDate 변경 시 스크롤 맨 위로 초기화
- AdminSchedule.jsx: hasSchedule, getScheduleColor, filteredSchedules에서 formatDate 사용
- AdminScheduleForm.jsx: 수정 모드 날짜 로드 시 formatDate 사용
- toISOString 대신 dayjs 기반 formatDate 사용
- dayjs 패키지 설치 (타임존 지원)
- utils/date.js 유틸리티 생성 (getTodayKST, formatDate, parseDateKST 등)
- PC/모바일 Home.jsx의 날짜 계산을 유틸리티로 교체
- PC Schedule.jsx, AdminSchedule.jsx의 getTodayKST 함수를 유틸리티로 교체
- KST 타임존 기준으로 정확한 날짜 계산 보장
- index.css: 모바일 레이아웃 CSS 시스템 추가 (mobile-layout-container, mobile-content, mobile-toolbar)
- Layout.jsx: MobileLayout에서 레이아웃 및 body 스크롤 제어 통합
- 하단 네비게이션을 fixed에서 flex-shrink-0으로 변경
- 모바일 스크롤바 숨김 처리
- Home, Members, Album, Schedule 페이지 여백 정리
- RSS 방식에서 YouTube API 방식으로 변경 (최근 10개 영상 조회)
- rss_url 컬럼 삭제
- Google Cloud Webhook으로 할당량 경고 수신
- 95% 도달 시 봇 자동 중지
- LA 시간 자정(할당량 리셋)에 봇 자동 재시작
- 봇 관리 페이지에 경고 배너 표시
- 모바일 레이아웃 및 하단 네비게이션 추가
- 홈 페이지: 히어로, 멤버, 앨범(2개), 일정 섹션
- 멤버 페이지: 현재/전 멤버 분리, 상세 모달
- 앨범 페이지: 목록, 상세, 갤러리
- 일정 페이지: 캘린더 피커, 세로 스크롤 목록
- ScrollToTop 컴포넌트로 페이지 이동 시 스크롤 초기화
- PC 홈 일정 API startDate+limit 방식으로 변경
- react-infinite-scroll-component를 useInfiniteQuery + useInView로 대체
- Schedule.jsx, AdminSchedule.jsx에 안정적인 무한 스크롤 적용
- source_name에 Link2 아이콘 추가 (카테고리 오른쪽 인라인 표시)
- 멤버 5명 이상일 경우 '프로미스나인'으로 표시 (탈퇴 멤버 고려)
- AdminSchedule 일반 모드에서 members 배열도 확인하여 멤버 표시
- QueryClientProvider 설정 추가 (main.jsx)
- 카테고리 정렬: 일정 개수 기준 내림차순, 0개 숨김, 기타는 맨 아래 고정
- useMemo로 카테고리 정렬 메모이제이션 (깜빡임 방지)
- 일정 수정 시 이미지 삭제 버그 수정 (existingImageIds 업데이트)
- 이미지 파일명에서 Date.now() 제거 (01.webp 형식 유지)
- 이미지 삭제 후 sort_order 재정렬 로직 추가
- 날짜 선택 시 요일 표시 추가 (2026년 1월 7일 (수) 형식)
- 백엔드: /api/schedules에 startDate, endDate, limit 파라미터 지원 추가
- 프론트엔드: 더미 데이터 제거, 실제 API 호출로 변경
- KST 기준으로 오늘 이후 3개 일정 표시
- 일정 페이지와 동일한 카드 스타일 적용
- 멤버 5명 이상이면 '프로미스나인'으로 표시
- 검색 모드 전환 시 일정 목록 fade 애니메이션 통일
- 일정 개수 텍스트 애니메이션 추가
- 관리자 일정 개수 표시 'N개 일정'으로 변경
- 일정 항목 애니메이션 y 이동 제거 (스크롤바 깜빡임 방지)
- 관리자 일정 페이지 상태 유지 (sessionStorage)
- 검색 결과 유사도순 정렬 (동일 유사도 시 최신 날짜 우선)
- 프론트엔드 검색 재정렬 제거 (Meilisearch 순서 유지)
- 관리자 일정 페이지 Meilisearch 검색 적용
- 일정 수정 시 Meilisearch 동기화 추가
- 서버 시작 시 자동 동기화
- 멤버 이름 쉼표 구분으로 통일
- Docker Compose에 Meilisearch 서비스 추가
- meilisearch.js 서비스 생성 (초기화, CRUD, 검색)
- 공개 일정 API에 Meilisearch 검색 통합
- 일정 생성/삭제 시 Meilisearch 자동 동기화
- YouTube 봇 일정 추가 시 Meilisearch 동기화
- sync-search API 추가 (기존 데이터 일괄 동기화)
- 다중 키워드, 오타 허용, 유사어 검색 지원
- 봇 스케줄러: 서버 시작 시 자동 초기화, 10초 간격 상태 동기화
- DB 리팩토링: bots 테이블에서 YouTube 컬럼 분리, bot_youtube_config 활용
- 봇별 커스텀 설정: BOT_CUSTOM_CONFIG 상수로 코드 내 관리
- 공개/관리자 일정 목록에 멤버 태그 표시 (5명 이상이면 '프로미스나인')
- 일정 목록 글씨 크기 증가 및 UI 개선
- source_name 관리자 일정에 뱃지로 표시
- 봇 시작/정지 토스트에 봇 이름 포함
- YouTube 일정 봇 서비스 추가 (youtube-bot.js, youtube-scheduler.js)
- 공개 일정 API 라우터 추가 (schedules.js)
- 관리자 일정 봇 관리 페이지 추가 (AdminScheduleBots.jsx)
- 백엔드 의존성 업데이트
- 헤더에 검색 토글 UI 추가 (밑줄 스타일 검색창)
- API 검색 기능 (/api/admin/schedules?search=) 연동
- 검색 모드에서 달력/카테고리 비활성화 (framer-motion animate)
- 검색 결과에 년.월 형식 날짜 표시 (2025.4)
- 카테고리 개수: 검색 시 결과 기준, 일반 시 해당 월 기준
- 달력/카테고리 구조 분리하여 독립 제어
- AdminSchedule.jsx도 동일한 비활성화 방식 적용