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>
6.8 KiB
6.8 KiB
프론트엔드 개선 계획서
1. 현재 문제점
1.1 API 구조
현재 구조:
api/
├── common/client.js # fetch 래퍼
├── index.js # 통합 export (혼란)
├── pc/
│ ├── admin/ # 관리자 API
│ ├── common/members.js # PC 공통?
│ └── public/ # 공개 API (어드민 함수도 섞여있음)
문제점:
- PC와 모바일이 같은 API를 사용하는데
pc/폴더 안에 있음 api/pc/public/schedules.js에 어드민 API 함수도 포함됨transformSchedule함수가 여러 파일에 중복api/index.js에서 같은 함수가 여러 번 export됨
1.2 컴포넌트 구조
현재 구조:
components/
├── common/ # 공통 (OK)
├── mobile/ # 모바일 (폴더 구분 없음)
├── pc/
│ ├── admin/ # 관리자 (schedule 폴더만 있음)
│ └── public/ # 공개 (폴더 구분 없음)
문제점:
admin/과public/내부에 기능별 폴더 구분이 없음- 파일이 많아지면 찾기 어려움
1.3 중복 코드
getMemberList: 16개 파일에서 사용, 일부는 로컬 정의decodeHtmlEntities: 여러 파일에 중복 정의transformSchedule: api/pc/public/schedules.js, api/pc/admin/schedules.js에 중복Schedules.jsx에 유틸 함수들이 로컬로 재정의됨
1.4 대형 파일
| 파일 | 원래 라인 수 | 현재 라인 수 | 상태 |
|---|---|---|---|
| AlbumPhotos.jsx | 1536 | 1536 | 미분리 |
| Schedules.jsx | 1465 | 1159 | ✅ 분리 완료 |
| ScheduleForm.jsx | 1047 | 765 | ✅ 분리 완료 |
| ScheduleDict.jsx | 714 | 714 | 미분리 |
| AlbumForm.jsx | 631 | 631 | 미분리 |
2. 개선 계획
2.1 API 구조 개선
개선 후:
api/
├── client.js # fetch 래퍼
├── transforms.js # 공통 변환 함수
├── public/ # 공개 API (PC/Mobile 공용)
│ ├── schedules.js
│ ├── albums.js
│ └── members.js
└── admin/ # 관리자 API
├── schedules.js
├── albums.js
├── members.js
├── categories.js
├── bots.js
└── stats.js
2.2 컴포넌트 구조 개선
개선 후:
components/
├── common/ # 공통 (유지)
├── mobile/
│ ├── layout/ # Layout, Header, BottomNav
│ └── schedule/ # ScheduleCard, BirthdayCard 등
├── pc/
│ ├── public/
│ │ ├── layout/ # Layout, Header, Footer
│ │ └── schedule/ # Calendar, ScheduleCard 등
│ └── admin/
│ ├── layout/ # Layout, Header
│ ├── common/ # ConfirmDialog, DatePicker 등
│ ├── schedule/ # ✅ 추가된 컴포넌트들:
│ │ ├── AdminScheduleCard.jsx
│ │ ├── CategorySelector.jsx
│ │ ├── ScheduleItem.jsx # 일정 아이템 (리스트용)
│ │ ├── LocationSearchDialog.jsx # 장소 검색 모달
│ │ ├── MemberSelector.jsx # 멤버 선택 UI
│ │ └── ImageUploader.jsx # 이미지 업로드
│ └── album/ # PhotoUploader 등
2.3 중복 코드 제거
utils/schedule.js 통합 사용
Schedules.jsx의 로컬 함수들 제거- 모든 곳에서
@/utils/scheduleimport
utils/format.js에 decodeHtmlEntities 통합
- 중복 정의 제거
api/transforms.js 생성
transformSchedule함수 통합
2.4 대형 파일 분리
AlbumPhotos.jsx (1536줄)
pages/pc/admin/albums/
├── AlbumPhotos.jsx # 메인 (상태 관리)
├── components/
│ ├── PhotoUploader.jsx # 업로드 UI
│ ├── PhotoGrid.jsx # 사진 그리드
│ ├── PhotoPreview.jsx # 미리보기 모달
│ └── BulkEditTools.jsx # 일괄 편집 도구
└── hooks/
└── usePhotoUpload.js # 업로드 로직
Schedules.jsx (1471줄)
pages/pc/admin/schedules/
├── Schedules.jsx # 메인
├── components/
│ ├── ScheduleList.jsx # 목록 (가상화)
│ ├── ScheduleSearch.jsx # 검색 UI
│ └── MonthNavigator.jsx # 월 선택
└── hooks/
└── useScheduleList.js # 목록 조회 로직
ScheduleForm.jsx (1046줄)
pages/pc/admin/schedules/
├── ScheduleForm.jsx # 메인
└── components/
├── BasicInfoForm.jsx # 기본 정보
├── MemberSelector.jsx # 멤버 선택
└── SourceInput.jsx # 출처 입력
3. 작업 순서
Phase 1: 구조 정리 (비파괴적) ✅ 완료
- API 구조 개선 (폴더 재배치)
api/pc/,api/common/→api/public/,api/admin/
- 미사용 코드 제거
- utils/format.js, utils/date.js 미사용 함수
- constants/index.js 미사용 상수
- 미사용 hooks, stores
- 컴포넌트 폴더 구조화 (layout/, common/, schedule/ 등)
- CATEGORY_ID 하드코딩 제거
- constants에서 삭제
- 카테고리 API 데이터의
name으로 비교하도록 변경
- 봇 관리 페이지 애니메이션 추가
- 페이지 stagger 애니메이션
- 통계 카드 AnimatedNumber
Phase 2: 대형 파일 분리 (진행 중)
- Schedules.jsx 분리 (1465줄 → 1159줄, 306줄 감소)
ScheduleItem.jsx컴포넌트 추출- 검색 모드와 일반 모드에서 공통 사용
- ScheduleForm.jsx 분리 (1047줄 → 765줄, 282줄 감소)
LocationSearchDialog.jsx추출 (장소 검색 모달)MemberSelector.jsx추출 (멤버 선택 UI)ImageUploader.jsx추출 (이미지 업로드 및 드래그앤드롭)
- AlbumPhotos.jsx 분리 (1536줄, 구조 복잡)
- ScheduleDict.jsx 분리 (714줄)
- AlbumForm.jsx 분리 (631줄)
Phase 3: 추가 개선
- 관리자 페이지용 에러 페이지 추가 (404)
- 모든 페이지 동작 확인
- 빌드 확인
4. 삭제된 항목
constants/index.js
CATEGORY_ID(하드코딩 → API name 비교로 변경)CATEGORY_NAMES(미사용)ALBUM_TYPES(미사용)SOCIAL_LINKS.tiktok(불필요)SOCIAL_LINKS.fancafe(불필요)
API 구조
api/pc/폴더 →api/public/,api/admin/으로 변경 완료api/common/→api/client.js로 통합 완료
utils
format.js: formatNumber, formatViewCount, formatFileSize, formatDuration, truncateTextdate.js: nowKST, parseDateKST, isPast, isFuture
hooks
- useCalendar, useLightbox, useMediaQuery, useScheduleFiltering, useScheduleSearch
stores
- useUIStore