fromis_9/docs/architecture.md

101 lines
5.3 KiB
Markdown
Raw Normal View History

# 프로젝트 구조
## 디렉토리 구조
```
fromis_9/
├── backend/ # Fastify 백엔드 (현재 사용)
│ ├── src/
│ │ ├── config/
│ │ │ ├── index.js # 환경변수 통합 관리
│ │ │ └── bots.js # 봇 설정 (YouTube, X)
│ │ ├── plugins/ # Fastify 플러그인
│ │ │ ├── db.js # MariaDB 연결
│ │ │ ├── redis.js # Redis 연결
│ │ │ ├── auth.js # JWT 인증
│ │ │ ├── meilisearch.js # 검색 엔진
│ │ │ └── scheduler.js # 봇 스케줄러
│ │ ├── routes/ # API 라우트
│ │ │ ├── auth/
│ │ │ ├── members/
│ │ │ ├── albums/
│ │ │ ├── schedules/
│ │ │ │ ├── index.js # 일정 조회/검색
│ │ │ │ └── suggestions.js
│ │ │ └── index.js # 라우트 등록
│ │ ├── services/ # 비즈니스 로직
│ │ │ ├── youtube/ # YouTube 봇
│ │ │ ├── x/ # X(Twitter) 봇
│ │ │ ├── meilisearch/ # 검색 서비스
│ │ │ └── suggestions/ # 추천 검색어
│ │ ├── app.js # Fastify 앱 설정
│ │ └── server.js # 진입점
│ └── package.json
├── backend-backup/ # Express 백엔드 (참조용, 마이그레이션 원본)
├── frontend/ # React 프론트엔드
│ ├── src/
│ │ ├── api/ # API 클라이언트
│ │ │ ├── index.js # fetchApi 유틸
│ │ │ ├── public/ # 공개 API
│ │ │ └── admin/ # 어드민 API
│ │ ├── components/ # 공통 컴포넌트
│ │ ├── pages/
│ │ │ ├── pc/ # PC 페이지
│ │ │ └── mobile/ # 모바일 페이지
│ │ ├── stores/ # Zustand 스토어
│ │ └── App.jsx
│ ├── vite.config.js
│ └── package.json
├── Dockerfile # 개발/배포 통합 (주석 전환)
├── docker-compose.yml
└── .env
```
## 서비스 구성
```
┌─────────────────────────────────────────────────────────┐
│ Caddy │
│ (리버스 프록시) │
└─────────────────────┬───────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ fromis9-frontend (Docker) │
│ ┌─────────────────┐ ┌─────────────────────────────┐ │
│ │ Vite (:80) │───▶│ Fastify (:3000) │ │
│ │ 프론트엔드 │ │ 백엔드 API │ │
│ └─────────────────┘ └──────────┬──────────────────┘ │
└─────────────────────────────────────┼───────────────────┘
┌────────────────────────────┼────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ MariaDB │ │ Meilisearch │ │ Redis │
│ (외부 DB망) │ │ (검색 엔진) │ │ (캐시) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
## 데이터베이스
### 주요 테이블
- `members` - 멤버 정보
- `member_nicknames` - 멤버 별명 (검색용)
- `albums` - 앨범 정보
- `schedules` - 일정
- `schedule_categories` - 일정 카테고리
- `schedule_youtube` - YouTube 영상 정보
- `schedule_x` - X(Twitter) 게시물 정보
- `schedule_members` - 일정-멤버 연결
- `images` - 이미지 메타데이터
### 검색 인덱스 (Meilisearch)
- `schedules` - 일정 검색용 인덱스
- 검색 필드: title, member_names, description, source_name, category_name
- 필터: category_id, date
- 정렬: date, time