# Wing Fleet Dashboard (gc-wing)

## 프로젝트 개요

- **타입**: React 19 + TypeScript 5.9 + Vite 7 (모노레포)
- **Node.js**: `.node-version` 참조 (v24)
- **패키지 매니저**: npm (workspaces)
- **구조**: apps/web (프론트엔드) + apps/api (백엔드 API 프록시)

## 빌드 및 실행

```bash
npm install          # 의존성 설치
npm run dev          # 전체 개발 서버
npm run dev:web      # 프론트엔드 (Vite)
npm run dev:api      # 백엔드 (Fastify + tsx watch)
npm run build        # 전체 빌드 (web + api)
npm run build:web    # 프론트엔드만
npm run lint         # apps/web ESLint
npm run prepare:data # 정적 데이터 준비
```

## 프로젝트 구조

```
gc-wing-dev/
├── apps/
│   ├── web/                # @wing/web - React 19 + Vite 7
│   │   └── src/
│   │       ├── app/        # App.tsx, styles.css
│   │       ├── entities/   # 도메인 모델 (aisTarget, vessel, zone, legacyVessel, subcable)
│   │       ├── features/   # 기능 모듈 (aisPolling, legacyDashboard, map3dSettings, mapSettings, mapToggles, typeFilter)
│   │       ├── pages/      # dashboard, login, denied, pending
│   │       ├── shared/     # auth (Google OAuth), lib (geo, color, map), hooks (usePersistedState)
│   │       └── widgets/    # map3d, vesselList, info, alarms, relations, aisInfo, aisTargetList, topbar, speed, legend, subcableInfo
│   └── api/                # @wing/api - Fastify 5
│       └── src/index.ts    # AIS 프록시 + zones 엔드포인트
├── data/                   # 정적 데이터
├── scripts/                # prepare-zones.mjs, prepare-legacy.mjs
└── legacy/                 # 레거시 데이터
```

## 기술 스택

| 영역 | 기술 |
|------|------|
| 프론트엔드 | React 19, Vite 7, TypeScript 5.9 |
| 지도 | MapLibre GL JS 5, Deck.gl 9 |
| 인증 | Google OAuth (AuthProvider + ProtectedRoute) |
| 백엔드 | Fastify 5, TypeScript |
| 린트 | ESLint 9, Prettier |

## 팀 규칙

- 코드 스타일: `.claude/rules/code-style.md`
- 네이밍 규칙: `.claude/rules/naming.md`
- 테스트 규칙: `.claude/rules/testing.md`
- Git 워크플로우: `.claude/rules/git-workflow.md`
- 팀 정책: `.claude/rules/team-policy.md`

## 의존성 관리

- Nexus 프록시 레포지토리를 통해 npm 패키지 관리 (`.npmrc`)
- 새 의존성 추가: `npm -w @wing/web install 패키지명`
- devDependency: `npm -w @wing/web install -D 패키지명`
