diff --git a/docs/improvement-plan.md b/docs/improvement-plan.md index 0f88fd6..0c89b16 100644 --- a/docs/improvement-plan.md +++ b/docs/improvement-plan.md @@ -72,16 +72,33 @@ --- -## 보류 (지금 안 함 — 큰 리팩터링) +## 보류 (지금 안 함 — 버그/보안 아님, 유지보수 부채) -당장 아픈 문제가 아니므로 해당 영역 작업 시 곁들이는 것을 권장: -- 봇 라우트 3종(festival/x/youtube) CRUD 팩토리화 -- 모바일 `ScheduleDetail.jsx`(1304줄) → `sections/` 분리(PC 구조와 일치) -- React Query 캐시 키 팩토리 중앙화 + 공통 데이터 훅(`useScheduleData` 등) 실제 사용 -- PC/모바일 `ScheduleCard`·`BirthdayCard`·`DebutCard` 공통 파생 훅(`useScheduleCardData`) -- `getActiveMemberCount` 중복 통합, 매직넘버/Nitter URL config 이전 -- 타임존(KST) 처리 통일, 멤버 PUT 트랜잭션화, `saveTweet` DUP catch -- JWT 수명 단축, CORS `credentials` 제거, Gemini 키 헤더 전달 +> 당장 깨지는 문제가 아니므로 **해당 영역을 어차피 만질 때 곁들여** 처리 권장. +> "같은 수정을 두 군데 반복하게 돼 짜증날 때"가 착수 신호. + +### A. 중복 제거 (비용 가장 큼) +- **일정 타입별 CRUD 공통화** — events/variety/concert/x/youtube가 "schedules insert + members + 이미지 저장 + meili 동기화"를 각자 복붙. 공통 `scheduleCore`(createBase/updateBase/setMembers/saveImage)로 추출. *(미완성 generic `/admin/schedules` 경로 정리도 함께)* +- **봇 라우트 3종(festival/x/youtube) CRUD 팩토리화** — formatRow·GET·POST·UPDATE빌더·DELETE가 거의 동일 → `createBotRoutes()` 팩토리 +- **PC/모바일 카드 공통 파생 훅** — `ScheduleCard`/`BirthdayCard`/`DebutCard`의 날짜·카테고리·멤버 계산을 `useScheduleCardData(schedule)`로, JSX만 플랫폼별 유지 +- **모바일 `ScheduleDetail.jsx`(1304줄) → `sections/` 분리** (PC `sections/` 구조와 일치시켜 이중 관리 해소) +- **`getActiveMemberCount` 중복 통합**(4곳), 멤버 API 모듈 이중화(admin/members.js vs public/members.js) 정리 + +### B. 거대 컴포넌트 분리 +- admin `Schedules.jsx`, 봇 다이얼로그(`YouTubeBotDialog` 912줄 등) — 데이터/UI 관심사 분리 + +### C. 일관성·정리 +- **React Query 캐시 키 팩토리 중앙화**(`['members']` vs `["members"]` 등) + 공통 데이터 훅(`useScheduleData` 등) 실제 사용 +- **에러 핸들링 컨벤션 통일** — `reply.code().send({error})` 직접 vs `utils/error.js` 헬퍼 혼용 → 헬퍼로 통일 +- **타임존(KST) 처리 통일** — `getTodayKST` vs 로컬 `new Date()` 혼용 +- **미완성 legacy `ScheduleForm` 제거** (죽은 generic 경로 관련) +- 매직넘버/Nitter URL `config`로 이전, JSON 컬럼 파싱 `parseJsonColumn` 유틸화 +- React key에 index 사용 지양(특히 PC 검색 추천), `getScheduleDetail`의 `s.*` → 필요 컬럼만 명시 + +### D. 안전·견고성 (소규모) +- 멤버 PUT 트랜잭션화, `saveTweet` `post_id` UNIQUE + `ER_DUP_ENTRY` catch *(스키마 변경 동반)* +- suggestions 수동 `fetch`에 `AbortController`(언마운트 후 setState 방지) +- JWT 수명 단축, CORS 불필요한 `credentials:true` 제거, Gemini 키 쿼리스트링 → 헤더 ---