# WING-OPS (해양 방제 운영 지원 시스템) 해양 오염 사고 대응 방제 운영 지원 시스템. 유류/HNS 확산 예측, 역추적 분석, 구조 시나리오, 항공 방제, 자산 관리, SCAT 조사, 기상/해상 정보를 통합 제공한다. ## 🚨 절대 지침 (Absolute Rules) ### 1. 신규 기능 설계/구현 전 develop 최신화 필수 신규 기능 설계나 구현을 시작하기 전, **반드시** 다음 절차를 사용자에게 권유하고 확인을 받을 것: 1. `git fetch origin` 으로 원격 `develop` 최신 상태 확인 2. `origin/develop`이 로컬 `develop`보다 앞서 있으면 → 로컬 `develop`을 최신화 (`git pull --ff-only` 또는 `git checkout -B develop origin/develop`) 3. 최신화된 `develop`에서 신규 브랜치 생성 (`git checkout -b /`) 4. 해당 브랜치에서 설계·구현 진행 > **이유**: 구 버전 develop 기반으로 작업 시 머지 충돌·중복 구현·사라진 코드 복원 등 위험. 최신 base에서 시작해야 MR 리뷰·릴리즈 흐름이 안전. ### 2. 프론트엔드 구성 시 디자인 시스템 준수 필수 모든 프론트엔드 UI 구현은 **반드시** [docs/DESIGN-SYSTEM.md](docs/DESIGN-SYSTEM.md) 규칙을 준수할 것: - 시맨틱 토큰(`--bg-base`, `--fg-default`, `--color-accent` 등) 사용 — 축약형/하드코딩 금지 - 폰트: `PretendardGOV` 단일 폰트 (4웨이트). `var(--font-korean)`, `var(--font-mono)` 경유 - 다크/라이트 테마 전환 지원 (`data-theme` 속성 기반) - Tailwind 컬러 키는 CSS 변수 참조 (`bg.base`, `fg.DEFAULT`, `color.accent`) - 폰트 크기 토큰: `text-caption/body-2/body-1/title-4...` — 인라인 `fontSize` 금지 > **이유**: 디자인 일관성·테마 전환·접근성(대비) 확보. 토큰 외 값은 리팩토링 비용을 증가시킴. - **타입**: react-ts 모노레포 (frontend + backend) - **Frontend**: React 19 + Vite 7 + TypeScript 5.9 + Tailwind CSS 3 - **Backend**: Express 4 + PostgreSQL (pg) + TypeScript - **DB**: PostgreSQL 16 + PostGIS (wing 운영DB + wing_auth 인증DB) - **상태관리**: Zustand (클라이언트), TanStack Query (서버) - **지도**: MapLibre GL JS 5.x + deck.gl 9.x (Leaflet 제거됨) - **실시간**: Socket.IO - **인증**: JWT (HttpOnly Cookie) + Google OAuth - **CI/CD**: Gitea Actions - **CSS**: Tailwind @layer 아키텍처 (base.css, components.css, wing.css) - **HTTP 정책**: GET/POST만 사용 (PUT/DELETE/PATCH 금지, 한국 보안취약점 점검 가이드 준수) - **RBAC**: AUTH_PERM OPER_CD (RCUD), permResolver 2차원 권한 엔진 ## 빌드/실행 ```bash cd frontend && npm install # Frontend npm run dev # Vite dev (localhost:5173) npm run build # tsc -b && vite build npm run lint # ESLint cd backend && npm install # Backend npm run dev # tsx watch (localhost:3001) npm run build && npm start # 프로덕션 npm run db:seed # DB 초기 데이터 ``` 테스트 프레임워크 미구성 (향후 Vitest + React Testing Library 도입 예정). ```bash cd frontend && npx eslint . # ESLint (flat config) npx prettier --write . # Prettier 자동 수정 ``` ## 프로젝트 구조 ``` wing/ ├── frontend/ React 19 + Vite 7 + TypeScript + Tailwind │ └── src/ │ ├── App.tsx 메인 (탭 라우팅, 감사 로그 자동 기록) │ ├── index.css @tailwind + @import 엔트리포인트 │ ├── common/ 공통 모듈 (@common/ alias) │ │ ├── components/ auth/, layer/, layout/, map/, ui/ │ │ ├── hooks/ useLayers, useSubMenu, useFeatureTracking │ │ ├── services/ api.ts, authApi.ts, layerService.ts │ │ ├── store/ authStore, menuStore (Zustand) │ │ ├── styles/ base.css, components.css, wing.css │ │ ├── constants/ featureIds.ts │ │ ├── types/ backtrack, boomLine, hns, navigation │ │ ├── utils/ coordinates, geo, sanitize, cn.ts │ │ └── data/ layerData.ts (UI 레이어 트리) │ └── components/ 탭 단위 패키지 (@components/ alias) │ ├── prediction/ 확산 예측 (OilSpillView, 역추적, 오일붐) │ ├── hns/ HNS 분석 (시나리오, 물질 DB, 재계산) │ ├── rescue/ 구조 시나리오 │ ├── aerial/ 항공 방제 (위성영상, 드론) │ ├── weather/ 해양 기상 (KHOA API, 오버레이) │ ├── incidents/ 사건/사고 관리 │ ├── board/ 게시판 │ ├── reports/ 보고서 │ ├── assets/ 자산 관리 (기관, 장비, 선박보험) │ ├── scat/ Pre-SCAT 해안조사 │ └── admin/ 관리자 (사용자/역할/권한/메뉴/설정) ├── backend/ Express + TypeScript │ └── src/ │ ├── server.ts 진입점 + 라우터 등록 │ ├── auth/ 인증 (JWT, OAuth, 미들웨어) │ ├── users/ 사용자 관리 │ ├── roles/ 역할/권한 관리 (permResolver) │ ├── settings/ 시스템 설정 │ ├── menus/ 메뉴 설정 │ ├── audit/ 감사 로그 │ ├── board/ 게시판 CRUD │ ├── reports/ 보고서 CRUD │ ├── assets/ 자산 관리 CRUD │ ├── incidents/ 사건/사고 CRUD │ ├── scat/ SCAT 조사 CRUD │ ├── prediction/ 확산 예측 CRUD │ ├── aerial/ 항공 방제 CRUD │ ├── rescue/ 구조 시나리오 CRUD │ ├── hns/ HNS 물질 검색 API │ ├── routes/ 레이어, 시뮬레이션 │ ├── middleware/ 보안 (입력 살균, rate-limit, Helmet CORP cross-origin) │ └── db/ DB 연결 (wingDb, authDb), seed ├── database/ SQL 스크립트 + 마이그레이션 (001~016) ├── docs/ 개발 문서 ├── .claude/ 팀 워크플로우 (rules, skills, scripts, agents) └── .githooks/ Git hooks (pre-commit, commit-msg) ``` ### Path Alias - `@common/*` -> `src/common/*` (공통 모듈) - `@components/*` -> `src/components/*` (탭 패키지) ## 팀 컨벤션 `.claude/rules/` 디렉토리 참조: - `team-policy.md` -- 보안/품질 정책 - `git-workflow.md` -- 브랜치/커밋/MR 규칙 - `code-style.md` -- TypeScript/React 코드 스타일 - `naming.md` -- 네이밍 규칙 - `testing.md` -- 테스트 규칙 - `subagent-policy.md` -- 서브에이전트 활용 정책 - `design-system.md` -- AI 에이전트 UI 디자인 시스템 규칙 (영문, 실사용) - `design-system-ko.md` -- 디자인 시스템 규칙 (한국어 참고용) ## 개발 문서 (docs/) - `docs/README.md` -- 프로젝트 아키텍처 상세 - `docs/DEVELOPMENT-GUIDE.md` -- 개발 워크플로우 전체 흐름 - `docs/COMMON-GUIDE.md` -- 공통 로직 가이드 (인증, 감사로그, 메뉴, API 통신, 상태관리, RBAC, 지도, CSS) - `docs/MENU-TAB-GUIDE.md` -- 새 메뉴 탭 추가 절차 (5단계) - `docs/CRUD-API-GUIDE.md` -- CRUD API 개발 가이드 (DB -> 백엔드 -> 프론트 End-to-End) - `docs/MOCK-TO-API-GUIDE.md` -- Mock -> API 전환 프로세스 - `docs/INSTALL_GUIDE.md` -- 설치 매뉴얼 (온라인/오프라인, DB 초기화) - `docs/CHANGELOG.md` -- 변경 이력 ### 문서 최신화 규칙 - 공통 기능을 추가/변경할 때 반드시 `docs/COMMON-GUIDE.md`를 최신화할 것 - API 인터페이스 변경 시 `memory/api-types.md` 갱신 - 개별 탭 개발자는 공통 가이드를 참조하여 연동 구현 ## 진행 중 작업 (완료 후 삭제) ### 폰트 크기 업스케일 작업 (진행 중) 반드시 `memory/font-upscale-plan.md`를 읽고 Phase 진행 상황을 확인할 것. **토큰 변경 매핑 (이름 유지, 값만 변경):** - `caption`/`label-2`/`title-6`: 11px → **12px** (0.75rem) - `label-1`/`title-5`: 12px → **13px** (0.8125rem) - `body-2`/`title-4`: 13px → **14px** (0.875rem) - `body-1`/`title-3`: 14px → **16px** (1rem) **네비게이션 클래스 교체:** - TopBar 메인탭: `text-title-4` → `text-title-2` (16px) - SubMenuBar 서브탭: `text-title-5` → `text-title-4` (14px) **작업 범위:** - Phase 1: tailwind.config.js + base.css 토큰 값 수정 - Phase 2: components.css 하드코딩(27곳) + wing.css `.wing-tab` text-xs→text-caption - Phase 3: TopBar.tsx + SubMenuBar.tsx 클래스 교체 - Phase 4: text-xs→text-caption, text-sm→text-body-2 스크립트 교체 (design 페이지 제외, 608건) - Phase 5: prediction 탭 인라인 fontSize 수정 - Phase 6 (보류): wing-header-bar 패딩 — 폰트 변경 후 유저 확인 후 진행 ### 디자인 시스템 폰트+색상 통일 작업 compact 후 반드시 `memory/design-system-work.md`를 읽고 작업 상태(완료/미완료 컴포넌트)를 확인할 것. **색상 규칙:** - 하드코딩 색상(`#ef4444`, `#a855f7` 등) → CSS 변수 전환 - `rgba(59,130,246,...)` 등 비-accent 계열 → `rgba(6,182,212,...)` (accent cyan) - 시맨틱 컬러(`color-accent`, `color-info`, `color-caution` 등)는 다양하게 사용 가능하되, 강조 색상은 **최대 2가지**로 제한 - `linear-gradient` → 단색으로 단순화 - 장식용 `border-top`, `border-left` → 제거 여부를 유저에게 확인 후 진행 **폰트 규칙:** - 하드코딩 `fontSize`/`fontWeight` → Tailwind 토큰 (`text-title-2`, `text-caption` 등) - `fontFamily: monospace` → `var(--font-mono)` - `fontFamily: sans-serif` / `'Noto Sans KR'` → `var(--font-korean)` - 인라인 `style={{ fontSize, padding }}` → Tailwind 클래스 전환 (가능한 범위) ## 환경 설정 - Node.js 20 (`.node-version`, fnm 사용) - npm registry: Nexus proxy (`.npmrc`) - Git hooks: `.githooks/` (core.hooksPath 설정됨)