- docs/RELEASE-NOTES.md 내부 제목 수정 - README.md 문서 링크 + 스킬 설명 수정 - CLAUDE.md 문서 목록 수정 - .claude/skills/init-project/SKILL.md 훅 메시지 + gitignore 예시 수정 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.8 KiB
6.8 KiB
WING-OPS (해양 방제 운영 지원 시스템)
해양 오염 사고 대응 방제 운영 지원 시스템. 유류/HNS 확산 예측, 역추적 분석, 구조 시나리오, 항공 방제, 자산 관리, SCAT 조사, 기상/해상 정보를 통합 제공한다.
- 타입: 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: public, auth, wing 3개 스키마)
- 상태관리: 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차원 권한 엔진
빌드/실행
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 도입 예정).
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 레이어 트리)
│ └── tabs/ 탭 단위 패키지 (@tabs/ 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), seed
├── database/ DB 스크립트
│ ├── schema/ ERD용 순수 DDL (14파일)
│ ├── seed/ 초기 데이터 (14파일)
│ ├── migration/ 증분 마이그레이션 (001~016)
│ └── _deprecated/ 구 스크립트 (통합 이전)
├── docs/ 개발 문서
├── .claude/ 팀 워크플로우 (rules, skills, scripts, agents)
└── .githooks/ Git hooks (pre-commit, commit-msg)
Path Alias
@common/*->src/common/*(공통 모듈)@tabs/*->src/tabs/*(탭 패키지)
팀 컨벤션
.claude/rules/ 디렉토리 참조:
team-policy.md-- 보안/품질 정책git-workflow.md-- 브랜치/커밋/MR 규칙code-style.md-- TypeScript/React 코드 스타일naming.md-- 네이밍 규칙testing.md-- 테스트 규칙subagent-policy.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/RELEASE-NOTES.md-- 변경 이력
문서 최신화 규칙
- 공통 기능을 추가/변경할 때 반드시
docs/COMMON-GUIDE.md를 최신화할 것 - API 인터페이스 변경 시
memory/api-types.md갱신 - 개별 탭 개발자는 공통 가이드를 참조하여 연동 구현
환경 설정
- Node.js 20 (
.node-version, fnm 사용) - npm registry: Nexus proxy (
.npmrc) - Git hooks:
.githooks/(core.hooksPath 설정됨)