fromis_9/docs/frontend-improvement.md
caadiq 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

6.9 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 572 분리 완료
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/schedule import

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: 구조 정리 (비파괴적) 완료

  1. API 구조 개선 (폴더 재배치)
    • api/pc/, api/common/api/public/, api/admin/
  2. 미사용 코드 제거
    • utils/format.js, utils/date.js 미사용 함수
    • constants/index.js 미사용 상수
    • 미사용 hooks, stores
  3. 컴포넌트 폴더 구조화 (layout/, common/, schedule/ 등)
  4. CATEGORY_ID 하드코딩 제거
    • constants에서 삭제
    • 카테고리 API 데이터의 name으로 비교하도록 변경
  5. 봇 관리 페이지 애니메이션 추가
    • 페이지 stagger 애니메이션
    • 통계 카드 AnimatedNumber

Phase 2: 대형 파일 분리 (진행 중)

  1. Schedules.jsx 분리 (1465줄 → 1159줄, 306줄 감소)
    • ScheduleItem.jsx 컴포넌트 추출
    • 검색 모드와 일반 모드에서 공통 사용
  2. ScheduleForm.jsx 분리 (1047줄 → 765줄, 282줄 감소)
    • LocationSearchDialog.jsx 추출 (장소 검색 모달)
    • MemberSelector.jsx 추출 (멤버 선택 UI)
    • ImageUploader.jsx 추출 (이미지 업로드 및 드래그앤드롭)
  3. ScheduleDict.jsx 분리 (714줄 → 572줄, 142줄 감소)
    • WordItem.jsx 추출 (단어 테이블 행 컴포넌트)
    • POS_TAGS 상수 함께 분리
  4. AlbumPhotos.jsx 분리 (1536줄, 구조 복잡)
  5. AlbumForm.jsx 분리 (631줄)

Phase 3: 추가 개선

  1. 관리자 페이지용 에러 페이지 추가 (404)
  2. 모든 페이지 동작 확인
  3. 빌드 확인

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, truncateText
  • date.js: nowKST, parseDateKST, isPast, isFuture

hooks

  • useCalendar, useLightbox, useMediaQuery, useScheduleFiltering, useScheduleSearch

stores

  • useUIStore