From e6319a571cbd97ae0a6fefb12fdb84d38c87fb6f Mon Sep 17 00:00:00 2001 From: htlee Date: Tue, 7 Apr 2026 08:47:24 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=AA=A8=EB=85=B8=EB=A0=88?= =?UTF-8?q?=ED=8F=AC=20=EA=B5=AC=EC=A1=B0=EB=A1=9C=20=EC=A0=84=ED=99=98=20?= =?UTF-8?q?(frontend/=20+=20backend/=20+=20database/)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1: 모노레포 디렉토리 구조 구축 - 기존 React 프로젝트를 frontend/ 디렉토리로 이동 (git mv) - backend/ 디렉토리 생성 (Phase 2에서 Spring Boot 초기화) - database/migration/ 디렉토리 생성 (Phase 2에서 Flyway 마이그레이션) - 루트 .gitignore에 frontend/, backend/ 경로 반영 - 루트 CLAUDE.md를 모노레포 가이드로 갱신 - Makefile 추가 (dev/build/lint 통합 명령) - frontend/vite.config.ts에 /api → :8080 백엔드 proxy 설정 - .githooks/pre-commit을 모노레포 구조에 맞게 갱신 (frontend/ 변경 시 frontend/ 내부에서 검증) Co-Authored-By: Claude Opus 4.6 (1M context) --- .githooks/pre-commit | 99 +++++++++------ .gitignore | 24 +++- CLAUDE.md | 118 +++++++++--------- Makefile | 47 +++++++ backend/README.md | 18 +++ database/migration/README.md | 30 +++++ .node-version => frontend/.node-version | 0 .npmrc => frontend/.npmrc | 0 .prettierignore => frontend/.prettierignore | 0 .prettierrc => frontend/.prettierrc | 0 eslint.config.js => frontend/eslint.config.js | 0 index.html => frontend/index.html | 0 .../package-lock.json | 0 package.json => frontend/package.json | 0 .../postcss.config.mjs | 0 {src => frontend/src}/app/App.tsx | 0 .../src}/app/auth/AuthContext.tsx | 0 .../src}/app/layout/MainLayout.tsx | 0 {src => frontend/src}/data/areasCodes.json | 0 {src => frontend/src}/data/commonCodes.ts | 0 {src => frontend/src}/data/fisheryCodes.json | 0 .../src}/data/mock/enforcement.ts | 0 {src => frontend/src}/data/mock/events.ts | 0 {src => frontend/src}/data/mock/gear.ts | 0 {src => frontend/src}/data/mock/kpi.ts | 0 {src => frontend/src}/data/mock/patrols.ts | 0 {src => frontend/src}/data/mock/transfers.ts | 0 {src => frontend/src}/data/mock/vessels.ts | 0 {src => frontend/src}/data/speciesCodes.json | 0 .../src}/data/vesselTypeCodes.json | 0 .../src}/features/admin/AccessControl.tsx | 0 .../src}/features/admin/AdminPanel.tsx | 0 .../src}/features/admin/DataHub.tsx | 0 .../src}/features/admin/NoticeManagement.tsx | 0 .../src}/features/admin/SystemConfig.tsx | 0 {src => frontend/src}/features/admin/index.ts | 0 .../features/ai-operations/AIAssistant.tsx | 0 .../ai-operations/AIModelManagement.tsx | 0 .../src}/features/ai-operations/MLOpsPage.tsx | 0 .../src}/features/ai-operations/index.ts | 0 .../src}/features/auth/LoginPage.tsx | 0 {src => frontend/src}/features/auth/index.ts | 0 .../src}/features/dashboard/Dashboard.tsx | 0 .../src}/features/dashboard/index.ts | 0 .../src}/features/detection/ChinaFishing.tsx | 0 .../detection/DarkVesselDetection.tsx | 0 .../src}/features/detection/GearDetection.tsx | 0 .../features/detection/GearIdentification.tsx | 0 .../src}/features/detection/index.ts | 0 .../enforcement/EnforcementHistory.tsx | 0 .../src}/features/enforcement/EventList.tsx | 0 .../src}/features/enforcement/index.ts | 0 .../src}/features/field-ops/AIAlert.tsx | 0 .../src}/features/field-ops/MobileService.tsx | 0 .../src}/features/field-ops/ShipAgent.tsx | 0 .../src}/features/field-ops/index.ts | 0 .../monitoring/MonitoringDashboard.tsx | 0 .../src}/features/monitoring/index.ts | 0 .../features/patrol/FleetOptimization.tsx | 0 .../src}/features/patrol/PatrolRoute.tsx | 0 .../src}/features/patrol/index.ts | 0 .../risk-assessment/EnforcementPlan.tsx | 0 .../src}/features/risk-assessment/RiskMap.tsx | 0 .../src}/features/risk-assessment/index.ts | 0 .../features/statistics/ExternalService.tsx | 0 .../features/statistics/ReportManagement.tsx | 0 .../src}/features/statistics/Statistics.tsx | 0 .../src}/features/statistics/index.ts | 0 .../features/surveillance/LiveMapView.tsx | 0 .../src}/features/surveillance/MapControl.tsx | 0 .../src}/features/surveillance/index.ts | 0 .../features/vessel/TransferDetection.tsx | 0 .../src}/features/vessel/VesselDetail.tsx | 0 .../src}/features/vessel/index.ts | 0 .../src}/lib/charts/BaseChart.tsx | 0 {src => frontend/src}/lib/charts/index.ts | 0 .../src}/lib/charts/presets/AreaChart.tsx | 0 .../src}/lib/charts/presets/BarChart.tsx | 0 .../src}/lib/charts/presets/LineChart.tsx | 0 .../src}/lib/charts/presets/PieChart.tsx | 0 .../src}/lib/charts/presets/index.ts | 0 {src => frontend/src}/lib/charts/theme.ts | 0 {src => frontend/src}/lib/charts/tokens.ts | 0 {src => frontend/src}/lib/i18n/config.ts | 0 {src => frontend/src}/lib/i18n/index.ts | 0 .../src}/lib/i18n/locales/en/admin.json | 0 .../src}/lib/i18n/locales/en/ai.json | 0 .../src}/lib/i18n/locales/en/auth.json | 0 .../src}/lib/i18n/locales/en/common.json | 0 .../src}/lib/i18n/locales/en/dashboard.json | 0 .../src}/lib/i18n/locales/en/detection.json | 0 .../src}/lib/i18n/locales/en/enforcement.json | 0 .../src}/lib/i18n/locales/en/fieldOps.json | 0 .../src}/lib/i18n/locales/en/patrol.json | 0 .../src}/lib/i18n/locales/en/statistics.json | 0 .../src}/lib/i18n/locales/ko/admin.json | 0 .../src}/lib/i18n/locales/ko/ai.json | 0 .../src}/lib/i18n/locales/ko/auth.json | 0 .../src}/lib/i18n/locales/ko/common.json | 0 .../src}/lib/i18n/locales/ko/dashboard.json | 0 .../src}/lib/i18n/locales/ko/detection.json | 0 .../src}/lib/i18n/locales/ko/enforcement.json | 0 .../src}/lib/i18n/locales/ko/fieldOps.json | 0 .../src}/lib/i18n/locales/ko/patrol.json | 0 .../src}/lib/i18n/locales/ko/statistics.json | 0 {src => frontend/src}/lib/map/BaseMap.tsx | 0 {src => frontend/src}/lib/map/constants.ts | 0 .../src}/lib/map/hooks/useMapLayers.ts | 0 {src => frontend/src}/lib/map/index.ts | 0 .../src}/lib/map/layers/boundaries.ts | 0 .../src}/lib/map/layers/heatmap.ts | 0 {src => frontend/src}/lib/map/layers/index.ts | 0 .../src}/lib/map/layers/markers.ts | 0 .../src}/lib/map/layers/polyline.ts | 0 .../src}/lib/map/layers/static.ts | 0 {src => frontend/src}/lib/map/layers/zones.ts | 0 {src => frontend/src}/lib/map/types.ts | 0 {src => frontend/src}/lib/theme/colors.ts | 0 {src => frontend/src}/lib/theme/index.ts | 0 {src => frontend/src}/lib/theme/tokens.ts | 0 {src => frontend/src}/lib/theme/variants.ts | 0 {src => frontend/src}/main.tsx | 0 {src => frontend/src}/services/api.ts | 0 {src => frontend/src}/services/event.ts | 0 {src => frontend/src}/services/index.ts | 0 {src => frontend/src}/services/kpi.ts | 0 {src => frontend/src}/services/patrol.ts | 0 {src => frontend/src}/services/vessel.ts | 0 {src => frontend/src}/services/ws.ts | 0 .../shared/components/common/DataTable.tsx | 0 .../shared/components/common/ExcelExport.tsx | 0 .../shared/components/common/FileUpload.tsx | 0 .../components/common/NotificationBanner.tsx | 0 .../shared/components/common/PageToolbar.tsx | 0 .../shared/components/common/Pagination.tsx | 0 .../shared/components/common/PrintButton.tsx | 0 .../shared/components/common/SaveButton.tsx | 0 .../shared/components/common/SearchInput.tsx | 0 .../src}/shared/components/common/index.ts | 0 .../src}/shared/components/ui/badge.tsx | 0 .../src}/shared/components/ui/card.tsx | 0 .../src}/stores/enforcementStore.ts | 0 {src => frontend/src}/stores/eventStore.ts | 0 {src => frontend/src}/stores/gearStore.ts | 0 {src => frontend/src}/stores/kpiStore.ts | 0 {src => frontend/src}/stores/patrolStore.ts | 0 {src => frontend/src}/stores/settingsStore.ts | 0 {src => frontend/src}/stores/transferStore.ts | 0 {src => frontend/src}/stores/vesselStore.ts | 0 {src => frontend/src}/styles/fonts.css | 0 {src => frontend/src}/styles/index.css | 0 {src => frontend/src}/styles/tailwind.css | 0 {src => frontend/src}/styles/theme.css | 0 {src => frontend/src}/vite-env.d.ts | 0 tsconfig.json => frontend/tsconfig.json | 0 vite.config.ts => frontend/vite.config.ts | 9 ++ 156 files changed, 241 insertions(+), 104 deletions(-) create mode 100644 Makefile create mode 100644 backend/README.md create mode 100644 database/migration/README.md rename .node-version => frontend/.node-version (100%) rename .npmrc => frontend/.npmrc (100%) rename .prettierignore => frontend/.prettierignore (100%) rename .prettierrc => frontend/.prettierrc (100%) rename eslint.config.js => frontend/eslint.config.js (100%) rename index.html => frontend/index.html (100%) rename package-lock.json => frontend/package-lock.json (100%) rename package.json => frontend/package.json (100%) rename postcss.config.mjs => frontend/postcss.config.mjs (100%) rename {src => frontend/src}/app/App.tsx (100%) rename {src => frontend/src}/app/auth/AuthContext.tsx (100%) rename {src => frontend/src}/app/layout/MainLayout.tsx (100%) rename {src => frontend/src}/data/areasCodes.json (100%) rename {src => frontend/src}/data/commonCodes.ts (100%) rename {src => frontend/src}/data/fisheryCodes.json (100%) rename {src => frontend/src}/data/mock/enforcement.ts (100%) rename {src => frontend/src}/data/mock/events.ts (100%) rename {src => frontend/src}/data/mock/gear.ts (100%) rename {src => frontend/src}/data/mock/kpi.ts (100%) rename {src => frontend/src}/data/mock/patrols.ts (100%) rename {src => frontend/src}/data/mock/transfers.ts (100%) rename {src => frontend/src}/data/mock/vessels.ts (100%) rename {src => frontend/src}/data/speciesCodes.json (100%) rename {src => frontend/src}/data/vesselTypeCodes.json (100%) rename {src => frontend/src}/features/admin/AccessControl.tsx (100%) rename {src => frontend/src}/features/admin/AdminPanel.tsx (100%) rename {src => frontend/src}/features/admin/DataHub.tsx (100%) rename {src => frontend/src}/features/admin/NoticeManagement.tsx (100%) rename {src => frontend/src}/features/admin/SystemConfig.tsx (100%) rename {src => frontend/src}/features/admin/index.ts (100%) rename {src => frontend/src}/features/ai-operations/AIAssistant.tsx (100%) rename {src => frontend/src}/features/ai-operations/AIModelManagement.tsx (100%) rename {src => frontend/src}/features/ai-operations/MLOpsPage.tsx (100%) rename {src => frontend/src}/features/ai-operations/index.ts (100%) rename {src => frontend/src}/features/auth/LoginPage.tsx (100%) rename {src => frontend/src}/features/auth/index.ts (100%) rename {src => frontend/src}/features/dashboard/Dashboard.tsx (100%) rename {src => frontend/src}/features/dashboard/index.ts (100%) rename {src => frontend/src}/features/detection/ChinaFishing.tsx (100%) rename {src => frontend/src}/features/detection/DarkVesselDetection.tsx (100%) rename {src => frontend/src}/features/detection/GearDetection.tsx (100%) rename {src => frontend/src}/features/detection/GearIdentification.tsx (100%) rename {src => frontend/src}/features/detection/index.ts (100%) rename {src => frontend/src}/features/enforcement/EnforcementHistory.tsx (100%) rename {src => frontend/src}/features/enforcement/EventList.tsx (100%) rename {src => frontend/src}/features/enforcement/index.ts (100%) rename {src => frontend/src}/features/field-ops/AIAlert.tsx (100%) rename {src => frontend/src}/features/field-ops/MobileService.tsx (100%) rename {src => frontend/src}/features/field-ops/ShipAgent.tsx (100%) rename {src => frontend/src}/features/field-ops/index.ts (100%) rename {src => frontend/src}/features/monitoring/MonitoringDashboard.tsx (100%) rename {src => frontend/src}/features/monitoring/index.ts (100%) rename {src => frontend/src}/features/patrol/FleetOptimization.tsx (100%) rename {src => frontend/src}/features/patrol/PatrolRoute.tsx (100%) rename {src => frontend/src}/features/patrol/index.ts (100%) rename {src => frontend/src}/features/risk-assessment/EnforcementPlan.tsx (100%) rename {src => frontend/src}/features/risk-assessment/RiskMap.tsx (100%) rename {src => frontend/src}/features/risk-assessment/index.ts (100%) rename {src => frontend/src}/features/statistics/ExternalService.tsx (100%) rename {src => frontend/src}/features/statistics/ReportManagement.tsx (100%) rename {src => frontend/src}/features/statistics/Statistics.tsx (100%) rename {src => frontend/src}/features/statistics/index.ts (100%) rename {src => frontend/src}/features/surveillance/LiveMapView.tsx (100%) rename {src => frontend/src}/features/surveillance/MapControl.tsx (100%) rename {src => frontend/src}/features/surveillance/index.ts (100%) rename {src => frontend/src}/features/vessel/TransferDetection.tsx (100%) rename {src => frontend/src}/features/vessel/VesselDetail.tsx (100%) rename {src => frontend/src}/features/vessel/index.ts (100%) rename {src => frontend/src}/lib/charts/BaseChart.tsx (100%) rename {src => frontend/src}/lib/charts/index.ts (100%) rename {src => frontend/src}/lib/charts/presets/AreaChart.tsx (100%) rename {src => frontend/src}/lib/charts/presets/BarChart.tsx (100%) rename {src => frontend/src}/lib/charts/presets/LineChart.tsx (100%) rename {src => frontend/src}/lib/charts/presets/PieChart.tsx (100%) rename {src => frontend/src}/lib/charts/presets/index.ts (100%) rename {src => frontend/src}/lib/charts/theme.ts (100%) rename {src => frontend/src}/lib/charts/tokens.ts (100%) rename {src => frontend/src}/lib/i18n/config.ts (100%) rename {src => frontend/src}/lib/i18n/index.ts (100%) rename {src => frontend/src}/lib/i18n/locales/en/admin.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/ai.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/auth.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/common.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/dashboard.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/detection.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/enforcement.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/fieldOps.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/patrol.json (100%) rename {src => frontend/src}/lib/i18n/locales/en/statistics.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/admin.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/ai.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/auth.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/common.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/dashboard.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/detection.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/enforcement.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/fieldOps.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/patrol.json (100%) rename {src => frontend/src}/lib/i18n/locales/ko/statistics.json (100%) rename {src => frontend/src}/lib/map/BaseMap.tsx (100%) rename {src => frontend/src}/lib/map/constants.ts (100%) rename {src => frontend/src}/lib/map/hooks/useMapLayers.ts (100%) rename {src => frontend/src}/lib/map/index.ts (100%) rename {src => frontend/src}/lib/map/layers/boundaries.ts (100%) rename {src => frontend/src}/lib/map/layers/heatmap.ts (100%) rename {src => frontend/src}/lib/map/layers/index.ts (100%) rename {src => frontend/src}/lib/map/layers/markers.ts (100%) rename {src => frontend/src}/lib/map/layers/polyline.ts (100%) rename {src => frontend/src}/lib/map/layers/static.ts (100%) rename {src => frontend/src}/lib/map/layers/zones.ts (100%) rename {src => frontend/src}/lib/map/types.ts (100%) rename {src => frontend/src}/lib/theme/colors.ts (100%) rename {src => frontend/src}/lib/theme/index.ts (100%) rename {src => frontend/src}/lib/theme/tokens.ts (100%) rename {src => frontend/src}/lib/theme/variants.ts (100%) rename {src => frontend/src}/main.tsx (100%) rename {src => frontend/src}/services/api.ts (100%) rename {src => frontend/src}/services/event.ts (100%) rename {src => frontend/src}/services/index.ts (100%) rename {src => frontend/src}/services/kpi.ts (100%) rename {src => frontend/src}/services/patrol.ts (100%) rename {src => frontend/src}/services/vessel.ts (100%) rename {src => frontend/src}/services/ws.ts (100%) rename {src => frontend/src}/shared/components/common/DataTable.tsx (100%) rename {src => frontend/src}/shared/components/common/ExcelExport.tsx (100%) rename {src => frontend/src}/shared/components/common/FileUpload.tsx (100%) rename {src => frontend/src}/shared/components/common/NotificationBanner.tsx (100%) rename {src => frontend/src}/shared/components/common/PageToolbar.tsx (100%) rename {src => frontend/src}/shared/components/common/Pagination.tsx (100%) rename {src => frontend/src}/shared/components/common/PrintButton.tsx (100%) rename {src => frontend/src}/shared/components/common/SaveButton.tsx (100%) rename {src => frontend/src}/shared/components/common/SearchInput.tsx (100%) rename {src => frontend/src}/shared/components/common/index.ts (100%) rename {src => frontend/src}/shared/components/ui/badge.tsx (100%) rename {src => frontend/src}/shared/components/ui/card.tsx (100%) rename {src => frontend/src}/stores/enforcementStore.ts (100%) rename {src => frontend/src}/stores/eventStore.ts (100%) rename {src => frontend/src}/stores/gearStore.ts (100%) rename {src => frontend/src}/stores/kpiStore.ts (100%) rename {src => frontend/src}/stores/patrolStore.ts (100%) rename {src => frontend/src}/stores/settingsStore.ts (100%) rename {src => frontend/src}/stores/transferStore.ts (100%) rename {src => frontend/src}/stores/vesselStore.ts (100%) rename {src => frontend/src}/styles/fonts.css (100%) rename {src => frontend/src}/styles/index.css (100%) rename {src => frontend/src}/styles/tailwind.css (100%) rename {src => frontend/src}/styles/theme.css (100%) rename {src => frontend/src}/vite-env.d.ts (100%) rename tsconfig.json => frontend/tsconfig.json (100%) rename vite.config.ts => frontend/vite.config.ts (80%) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 7a28940..c469fcd 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -1,54 +1,73 @@ #!/bin/bash #============================================================================== -# pre-commit hook (React TypeScript) -# TypeScript 컴파일 + 린트 검증 — 실패 시 커밋 차단 +# pre-commit hook (Monorepo: frontend + backend) +# 변경된 영역만 선택적으로 검증 #============================================================================== -echo "pre-commit: TypeScript 타입 체크 중..." +# 스테이징된 파일 목록 +STAGED=$(git diff --cached --name-only --diff-filter=ACM) -# npm 확인 -if ! command -v npx &>/dev/null; then - echo "경고: npx가 설치되지 않았습니다. 검증을 건너뜁니다." - exit 0 +# frontend 변경 확인 +FRONTEND_CHANGED=$(echo "$STAGED" | grep -E '^frontend/' || true) + +# backend 변경 확인 +BACKEND_CHANGED=$(echo "$STAGED" | grep -E '^backend/' || true) + +# === Frontend 검증 === +if [ -n "$FRONTEND_CHANGED" ] && [ -d "frontend" ]; then + echo "pre-commit: frontend TypeScript 타입 체크 중..." + + if ! command -v npx &>/dev/null; then + echo "경고: npx가 설치되지 않았습니다. 검증을 건너뜁니다." + elif [ ! -d "frontend/node_modules" ]; then + echo "경고: frontend/node_modules가 없습니다. 'cd frontend && npm install' 후 다시 시도하세요." + exit 1 + else + (cd frontend && npx tsc --noEmit --pretty 2>&1) + TSC_RESULT=$? + + if [ $TSC_RESULT -ne 0 ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════╗" + echo "║ TypeScript 타입 에러! 커밋이 차단되었습니다. ║" + echo "╚══════════════════════════════════════════════════════════╝" + exit 1 + fi + echo "pre-commit: 타입 체크 성공" + + # ESLint + if [ -f "frontend/eslint.config.js" ] || [ -f "frontend/eslint.config.mjs" ]; then + echo "pre-commit: frontend ESLint 검증 중..." + (cd frontend && npx eslint src/ --quiet 2>&1) + LINT_RESULT=$? + + if [ $LINT_RESULT -ne 0 ]; then + echo "" + echo "╔══════════════════════════════════════════════════════════╗" + echo "║ ESLint 에러! 커밋이 차단되었습니다. ║" + echo "║ 'cd frontend && npm run lint:fix'로 자동 수정 시도. ║" + echo "╚══════════════════════════════════════════════════════════╝" + exit 1 + fi + echo "pre-commit: ESLint 통과" + fi + fi fi -# node_modules 확인 -if [ ! -d "node_modules" ]; then - echo "경고: node_modules가 없습니다. 'npm install' 실행 후 다시 시도하세요." - exit 1 -fi +# === Backend 검증 === +if [ -n "$BACKEND_CHANGED" ] && [ -d "backend" ] && [ -f "backend/pom.xml" ]; then + echo "pre-commit: backend 컴파일 체크 중..." + (cd backend && ./mvnw compile -q 2>&1) + MVN_RESULT=$? -# TypeScript 타입 체크 -npx tsc --noEmit --pretty 2>&1 -TSC_RESULT=$? - -if [ $TSC_RESULT -ne 0 ]; then - echo "" - echo "╔══════════════════════════════════════════════════════════╗" - echo "║ TypeScript 타입 에러! 커밋이 차단되었습니다. ║" - echo "║ 타입 에러를 수정한 후 다시 커밋해주세요. ║" - echo "╚══════════════════════════════════════════════════════════╝" - echo "" - exit 1 -fi - -echo "pre-commit: 타입 체크 성공" - -# ESLint 검증 (설정 파일이 있는 경우만) -if [ -f ".eslintrc.js" ] || [ -f ".eslintrc.json" ] || [ -f ".eslintrc.cjs" ] || [ -f "eslint.config.js" ] || [ -f "eslint.config.mjs" ]; then - echo "pre-commit: ESLint 검증 중..." - npx eslint src/ --ext .ts,.tsx --quiet 2>&1 - LINT_RESULT=$? - - if [ $LINT_RESULT -ne 0 ]; then + if [ $MVN_RESULT -ne 0 ]; then echo "" echo "╔══════════════════════════════════════════════════════════╗" - echo "║ ESLint 에러! 커밋이 차단되었습니다. ║" - echo "║ 'npm run lint -- --fix'로 자동 수정을 시도해보세요. ║" + echo "║ Backend 컴파일 에러! 커밋이 차단되었습니다. ║" echo "╚══════════════════════════════════════════════════════════╝" - echo "" exit 1 fi - - echo "pre-commit: ESLint 통과" + echo "pre-commit: backend 컴파일 성공" fi + +exit 0 diff --git a/.gitignore b/.gitignore index 10ab9d5..1e9ea7f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,11 @@ # === Build === -dist/ -build/ +frontend/dist/ +frontend/build/ +backend/target/ +backend/build/ # === Dependencies === +frontend/node_modules/ node_modules/ # === IDE === @@ -27,12 +30,15 @@ yarn-debug.log* yarn-error.log* # === Test === -coverage/ +frontend/coverage/ +backend/coverage/ # === Cache === -.eslintcache -.prettiercache -*.tsbuildinfo +frontend/.eslintcache +frontend/.prettiercache +frontend/*.tsbuildinfo +frontend/.vite/ +.vite/ # === Code Review Graph (로컬 전용) === .code-review-graph/ @@ -55,3 +61,9 @@ coverage/ .claude/skills/version/ .claude/skills/fix-issue/ .claude/scripts/ + +# === Backend (Spring Boot) === +backend/.mvn/wrapper/maven-wrapper.jar +backend/.gradle/ +backend/HELP.md +backend/*.log diff --git a/CLAUDE.md b/CLAUDE.md index afdc18e..2d4b589 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,74 +1,76 @@ -# KCG AI Monitoring +# KCG AI Monitoring (모노레포) 해양경찰청 AI 기반 불법어선 탐지 및 단속 지원 플랫폼 -## 기술 스택 +## 모노레포 구조 -- **프레임워크**: React 19 + TypeScript 5.9 -- **빌드**: Vite 8 -- **스타일**: Tailwind CSS 4 + CVA (class-variance-authority) -- **지도**: MapLibre GL 5 + deck.gl 9 -- **차트**: ECharts 6 -- **상태관리**: Zustand 5 -- **다국어**: i18next (ko/en, 10개 네임스페이스) -- **라우팅**: React Router 7 -- **린트**: ESLint 10 (flat config) +``` +kcg-ai-monitoring/ +├── frontend/ # React 19 + TypeScript + Vite (UI) +├── backend/ # Spring Boot 3.x + Java 21 (자체 인증/권한/감사 + 분석 프록시) +├── database/ # PostgreSQL 마이그레이션 (Flyway) +│ └── migration/ +├── docs/ # 프로젝트 문서 (SFR, 아키텍처) +├── .claude/ # Claude Code 워크플로우 +├── .githooks/ # Git hooks (commit-msg, pre-commit, post-checkout) +└── Makefile # 통합 dev/build 명령 +``` + +## 시스템 구성 + +``` +[Frontend Vite :5173] ──→ [Backend Spring :8080] ──┬→ [Iran Backend :8080] (분석 데이터 read) + │ └→ [Prediction FastAPI :8001] + └→ [PostgreSQL kcgaidb] (자체 인증/권한/감사/의사결정) +``` + +- **자체 백엔드**: 인증/권한/감사로그/관리자 + 운영자 의사결정 (확정/제외/학습) +- **iran 백엔드 프록시**: 분석 결과 read-only 참조 (vessel_analysis, group_polygons, correlations) +- **신규 DB (kcgaidb)**: 자체 생산 데이터만 저장, prediction 분석 테이블은 미복사 ## 명령어 ```bash -npm run dev # 개발 서버 (Vite) -npm run build # 프로덕션 빌드 -npm run lint # ESLint 검사 -npm run lint:fix # ESLint 자동 수정 -npm run format # Prettier 포맷팅 -npm run format:check # 포맷팅 검사 +make install # 의존성 설치 +make dev # 프론트 + 백엔드 동시 실행 +make dev-frontend # 프론트만 +make dev-backend # 백엔드만 +make build # 전체 빌드 +make lint # 프론트 lint +make format # 프론트 prettier ``` -## 디렉토리 구조 +## 기술 스택 -``` -src/ -├── app/ # 라우터, 인증, 레이아웃 -├── features/ # 13개 도메인 모듈 (31+ 페이지) -│ ├── admin/ # 관리자 -│ ├── ai-operations/ # AI 작전 -│ ├── auth/ # 인증 -│ ├── dashboard/ # 대시보드 -│ ├── detection/ # 탐지 -│ ├── enforcement/ # 단속 -│ ├── field-ops/ # 현장작전 -│ ├── monitoring/ # 모니터링 -│ ├── patrol/ # 순찰 -│ ├── risk-assessment/# 위험평가 -│ ├── statistics/ # 통계 -│ ├── surveillance/ # 감시 -│ └── vessel/ # 선박 -├── lib/ # 공유 라이브러리 -│ ├── charts/ # ECharts 래퍼 + 프리셋 -│ ├── i18n/ # i18next 설정 + 로케일 -│ ├── map/ # MapLibre + deck.gl 통합 -│ └── theme/ # 디자인 토큰 + CVA 변형 -├── data/mock/ # 7개 목 데이터 모듈 -├── stores/ # Zustand 스토어 (8개) -├── services/ # API 서비스 샘플 -├── shared/ # 공유 UI 컴포넌트 -└── styles/ # CSS (Dark/Light 테마) -``` +### Frontend (`frontend/`) +- React 19, TypeScript 5.9, Vite 8 +- Tailwind CSS 4 + CVA +- MapLibre GL 5 + deck.gl 9 (지도) +- ECharts 6 (차트) +- Zustand 5 (상태관리) +- i18next (ko/en) +- React Router 7 +- ESLint 10 + Prettier -## Path Alias +### Backend (`backend/`) — Phase 2에서 초기화 +- Spring Boot 3.x + Java 21 +- Spring Security + JWT +- PostgreSQL + Flyway +- Caffeine (권한 캐싱) +- 트리 기반 RBAC (wing 패턴) -| Alias | 경로 | -|-------|------| -| `@/` | `src/` | -| `@lib/` | `src/lib/` | -| `@shared/` | `src/shared/` | -| `@features/` | `src/features/` | -| `@data/` | `src/data/` | -| `@stores/` | `src/stores/` | +### Database (`kcgaidb`) +- PostgreSQL +- 사용자: `kcg-app` +- 스키마: `kcg` + +## 권한 체계 + +좌측 탭(메뉴) = 권한 그룹, 내부 패널/액션 = 자식 자원, CRUD 단위 개별 제어. +상세는 `.claude/plans/vast-tinkering-knuth.md` 참조. ## 팀 컨벤션 -- 팀 규칙은 `.claude/rules/` 참조 -- 커밋: Conventional Commits (한국어), `.githooks/commit-msg`로 검증 -- Git Hooks: `.githooks/` (core.hooksPath 설정됨) +- 팀 규칙: `.claude/rules/` +- 커밋: Conventional Commits (한국어), `.githooks/commit-msg` 검증 +- pre-commit: `frontend/` 디렉토리 기준 TypeScript + ESLint 검증 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7f1ba41 --- /dev/null +++ b/Makefile @@ -0,0 +1,47 @@ +.PHONY: help install dev dev-frontend dev-backend build build-frontend build-backend lint format test clean + +help: + @echo "사용 가능한 명령:" + @echo " make install - 프론트엔드 의존성 설치" + @echo " make dev - 프론트엔드 + 백엔드 동시 실행" + @echo " make dev-frontend - 프론트엔드 dev 서버만 실행 (Vite)" + @echo " make dev-backend - 백엔드 dev 서버만 실행 (Spring Boot)" + @echo " make build - 프론트엔드 + 백엔드 빌드" + @echo " make build-frontend - 프론트엔드 빌드" + @echo " make build-backend - 백엔드 빌드" + @echo " make lint - 프론트엔드 lint 검사" + @echo " make format - 프론트엔드 prettier 포맷팅" + @echo " make clean - 빌드 산출물 삭제" + +install: + cd frontend && npm install + @if [ -f backend/pom.xml ]; then cd backend && ./mvnw dependency:resolve || true; fi + +dev-frontend: + cd frontend && npm run dev + +dev-backend: + @if [ -f backend/pom.xml ]; then cd backend && ./mvnw spring-boot:run -Dspring-boot.run.profiles=local; \ + else echo "백엔드가 아직 초기화되지 않았습니다 (Phase 2에서 추가)"; fi + +dev: + @$(MAKE) -j2 dev-frontend dev-backend + +build-frontend: + cd frontend && npm run build + +build-backend: + @if [ -f backend/pom.xml ]; then cd backend && ./mvnw clean package -DskipTests; \ + else echo "백엔드가 아직 초기화되지 않았습니다 (Phase 2에서 추가)"; fi + +build: build-frontend build-backend + +lint: + cd frontend && npm run lint + +format: + cd frontend && npm run format + +clean: + rm -rf frontend/dist frontend/node_modules/.vite + @if [ -f backend/pom.xml ]; then cd backend && ./mvnw clean; fi diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..f4428c9 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,18 @@ +# Backend (Spring Boot) + +Phase 2에서 초기화 예정. + +## 계획된 구성 +- Spring Boot 3.x + Java 21 +- PostgreSQL + Flyway +- Spring Security + JWT +- Caffeine 캐시 +- 트리 기반 RBAC 권한 체계 (wing 패턴) + +## 책임 +- 자체 인증/권한/감사로그 +- 운영자 의사결정 (모선 확정/제외/학습) +- iran 백엔드 분석 데이터 프록시 +- 관리자 화면 API + +상세 설계: `.claude/plans/vast-tinkering-knuth.md` diff --git a/database/migration/README.md b/database/migration/README.md new file mode 100644 index 0000000..98f608e --- /dev/null +++ b/database/migration/README.md @@ -0,0 +1,30 @@ +# Database Migrations + +PostgreSQL 마이그레이션 (Flyway 형식). + +## DB 정보 +- DB Name: `kcgaidb` +- User: `kcg-app` +- Schema: `kcg` + +## 마이그레이션 파일 (Phase 2에서 작성) + +| 파일 | 내용 | +|---|---| +| `V001__auth_init.sql` | 사용자, 조직, 역할, 로그인 이력 | +| `V002__perm_tree.sql` | 권한 트리 + 권한 매트릭스 | +| `V003__perm_seed.sql` | 초기 역할 + 트리 노드 시드 | +| `V004__access_logs.sql` | 감사로그, 접근 이력 | +| `V005__parent_workflow.sql` | 모선 워크플로우 (운영자 결정/제외/학습 세션) | + +## 실행 방법 + +```bash +# DB 생성 (1회) +psql -U postgres -c "CREATE DATABASE kcgaidb;" +psql -U postgres -c "CREATE USER \"kcg-app\" WITH PASSWORD 'Kcg2026ai';" +psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE kcgaidb TO \"kcg-app\";" + +# 마이그레이션은 backend Spring Boot가 기동 시 자동 실행 (Flyway) +cd backend && ./mvnw spring-boot:run +``` diff --git a/.node-version b/frontend/.node-version similarity index 100% rename from .node-version rename to frontend/.node-version diff --git a/.npmrc b/frontend/.npmrc similarity index 100% rename from .npmrc rename to frontend/.npmrc diff --git a/.prettierignore b/frontend/.prettierignore similarity index 100% rename from .prettierignore rename to frontend/.prettierignore diff --git a/.prettierrc b/frontend/.prettierrc similarity index 100% rename from .prettierrc rename to frontend/.prettierrc diff --git a/eslint.config.js b/frontend/eslint.config.js similarity index 100% rename from eslint.config.js rename to frontend/eslint.config.js diff --git a/index.html b/frontend/index.html similarity index 100% rename from index.html rename to frontend/index.html diff --git a/package-lock.json b/frontend/package-lock.json similarity index 100% rename from package-lock.json rename to frontend/package-lock.json diff --git a/package.json b/frontend/package.json similarity index 100% rename from package.json rename to frontend/package.json diff --git a/postcss.config.mjs b/frontend/postcss.config.mjs similarity index 100% rename from postcss.config.mjs rename to frontend/postcss.config.mjs diff --git a/src/app/App.tsx b/frontend/src/app/App.tsx similarity index 100% rename from src/app/App.tsx rename to frontend/src/app/App.tsx diff --git a/src/app/auth/AuthContext.tsx b/frontend/src/app/auth/AuthContext.tsx similarity index 100% rename from src/app/auth/AuthContext.tsx rename to frontend/src/app/auth/AuthContext.tsx diff --git a/src/app/layout/MainLayout.tsx b/frontend/src/app/layout/MainLayout.tsx similarity index 100% rename from src/app/layout/MainLayout.tsx rename to frontend/src/app/layout/MainLayout.tsx diff --git a/src/data/areasCodes.json b/frontend/src/data/areasCodes.json similarity index 100% rename from src/data/areasCodes.json rename to frontend/src/data/areasCodes.json diff --git a/src/data/commonCodes.ts b/frontend/src/data/commonCodes.ts similarity index 100% rename from src/data/commonCodes.ts rename to frontend/src/data/commonCodes.ts diff --git a/src/data/fisheryCodes.json b/frontend/src/data/fisheryCodes.json similarity index 100% rename from src/data/fisheryCodes.json rename to frontend/src/data/fisheryCodes.json diff --git a/src/data/mock/enforcement.ts b/frontend/src/data/mock/enforcement.ts similarity index 100% rename from src/data/mock/enforcement.ts rename to frontend/src/data/mock/enforcement.ts diff --git a/src/data/mock/events.ts b/frontend/src/data/mock/events.ts similarity index 100% rename from src/data/mock/events.ts rename to frontend/src/data/mock/events.ts diff --git a/src/data/mock/gear.ts b/frontend/src/data/mock/gear.ts similarity index 100% rename from src/data/mock/gear.ts rename to frontend/src/data/mock/gear.ts diff --git a/src/data/mock/kpi.ts b/frontend/src/data/mock/kpi.ts similarity index 100% rename from src/data/mock/kpi.ts rename to frontend/src/data/mock/kpi.ts diff --git a/src/data/mock/patrols.ts b/frontend/src/data/mock/patrols.ts similarity index 100% rename from src/data/mock/patrols.ts rename to frontend/src/data/mock/patrols.ts diff --git a/src/data/mock/transfers.ts b/frontend/src/data/mock/transfers.ts similarity index 100% rename from src/data/mock/transfers.ts rename to frontend/src/data/mock/transfers.ts diff --git a/src/data/mock/vessels.ts b/frontend/src/data/mock/vessels.ts similarity index 100% rename from src/data/mock/vessels.ts rename to frontend/src/data/mock/vessels.ts diff --git a/src/data/speciesCodes.json b/frontend/src/data/speciesCodes.json similarity index 100% rename from src/data/speciesCodes.json rename to frontend/src/data/speciesCodes.json diff --git a/src/data/vesselTypeCodes.json b/frontend/src/data/vesselTypeCodes.json similarity index 100% rename from src/data/vesselTypeCodes.json rename to frontend/src/data/vesselTypeCodes.json diff --git a/src/features/admin/AccessControl.tsx b/frontend/src/features/admin/AccessControl.tsx similarity index 100% rename from src/features/admin/AccessControl.tsx rename to frontend/src/features/admin/AccessControl.tsx diff --git a/src/features/admin/AdminPanel.tsx b/frontend/src/features/admin/AdminPanel.tsx similarity index 100% rename from src/features/admin/AdminPanel.tsx rename to frontend/src/features/admin/AdminPanel.tsx diff --git a/src/features/admin/DataHub.tsx b/frontend/src/features/admin/DataHub.tsx similarity index 100% rename from src/features/admin/DataHub.tsx rename to frontend/src/features/admin/DataHub.tsx diff --git a/src/features/admin/NoticeManagement.tsx b/frontend/src/features/admin/NoticeManagement.tsx similarity index 100% rename from src/features/admin/NoticeManagement.tsx rename to frontend/src/features/admin/NoticeManagement.tsx diff --git a/src/features/admin/SystemConfig.tsx b/frontend/src/features/admin/SystemConfig.tsx similarity index 100% rename from src/features/admin/SystemConfig.tsx rename to frontend/src/features/admin/SystemConfig.tsx diff --git a/src/features/admin/index.ts b/frontend/src/features/admin/index.ts similarity index 100% rename from src/features/admin/index.ts rename to frontend/src/features/admin/index.ts diff --git a/src/features/ai-operations/AIAssistant.tsx b/frontend/src/features/ai-operations/AIAssistant.tsx similarity index 100% rename from src/features/ai-operations/AIAssistant.tsx rename to frontend/src/features/ai-operations/AIAssistant.tsx diff --git a/src/features/ai-operations/AIModelManagement.tsx b/frontend/src/features/ai-operations/AIModelManagement.tsx similarity index 100% rename from src/features/ai-operations/AIModelManagement.tsx rename to frontend/src/features/ai-operations/AIModelManagement.tsx diff --git a/src/features/ai-operations/MLOpsPage.tsx b/frontend/src/features/ai-operations/MLOpsPage.tsx similarity index 100% rename from src/features/ai-operations/MLOpsPage.tsx rename to frontend/src/features/ai-operations/MLOpsPage.tsx diff --git a/src/features/ai-operations/index.ts b/frontend/src/features/ai-operations/index.ts similarity index 100% rename from src/features/ai-operations/index.ts rename to frontend/src/features/ai-operations/index.ts diff --git a/src/features/auth/LoginPage.tsx b/frontend/src/features/auth/LoginPage.tsx similarity index 100% rename from src/features/auth/LoginPage.tsx rename to frontend/src/features/auth/LoginPage.tsx diff --git a/src/features/auth/index.ts b/frontend/src/features/auth/index.ts similarity index 100% rename from src/features/auth/index.ts rename to frontend/src/features/auth/index.ts diff --git a/src/features/dashboard/Dashboard.tsx b/frontend/src/features/dashboard/Dashboard.tsx similarity index 100% rename from src/features/dashboard/Dashboard.tsx rename to frontend/src/features/dashboard/Dashboard.tsx diff --git a/src/features/dashboard/index.ts b/frontend/src/features/dashboard/index.ts similarity index 100% rename from src/features/dashboard/index.ts rename to frontend/src/features/dashboard/index.ts diff --git a/src/features/detection/ChinaFishing.tsx b/frontend/src/features/detection/ChinaFishing.tsx similarity index 100% rename from src/features/detection/ChinaFishing.tsx rename to frontend/src/features/detection/ChinaFishing.tsx diff --git a/src/features/detection/DarkVesselDetection.tsx b/frontend/src/features/detection/DarkVesselDetection.tsx similarity index 100% rename from src/features/detection/DarkVesselDetection.tsx rename to frontend/src/features/detection/DarkVesselDetection.tsx diff --git a/src/features/detection/GearDetection.tsx b/frontend/src/features/detection/GearDetection.tsx similarity index 100% rename from src/features/detection/GearDetection.tsx rename to frontend/src/features/detection/GearDetection.tsx diff --git a/src/features/detection/GearIdentification.tsx b/frontend/src/features/detection/GearIdentification.tsx similarity index 100% rename from src/features/detection/GearIdentification.tsx rename to frontend/src/features/detection/GearIdentification.tsx diff --git a/src/features/detection/index.ts b/frontend/src/features/detection/index.ts similarity index 100% rename from src/features/detection/index.ts rename to frontend/src/features/detection/index.ts diff --git a/src/features/enforcement/EnforcementHistory.tsx b/frontend/src/features/enforcement/EnforcementHistory.tsx similarity index 100% rename from src/features/enforcement/EnforcementHistory.tsx rename to frontend/src/features/enforcement/EnforcementHistory.tsx diff --git a/src/features/enforcement/EventList.tsx b/frontend/src/features/enforcement/EventList.tsx similarity index 100% rename from src/features/enforcement/EventList.tsx rename to frontend/src/features/enforcement/EventList.tsx diff --git a/src/features/enforcement/index.ts b/frontend/src/features/enforcement/index.ts similarity index 100% rename from src/features/enforcement/index.ts rename to frontend/src/features/enforcement/index.ts diff --git a/src/features/field-ops/AIAlert.tsx b/frontend/src/features/field-ops/AIAlert.tsx similarity index 100% rename from src/features/field-ops/AIAlert.tsx rename to frontend/src/features/field-ops/AIAlert.tsx diff --git a/src/features/field-ops/MobileService.tsx b/frontend/src/features/field-ops/MobileService.tsx similarity index 100% rename from src/features/field-ops/MobileService.tsx rename to frontend/src/features/field-ops/MobileService.tsx diff --git a/src/features/field-ops/ShipAgent.tsx b/frontend/src/features/field-ops/ShipAgent.tsx similarity index 100% rename from src/features/field-ops/ShipAgent.tsx rename to frontend/src/features/field-ops/ShipAgent.tsx diff --git a/src/features/field-ops/index.ts b/frontend/src/features/field-ops/index.ts similarity index 100% rename from src/features/field-ops/index.ts rename to frontend/src/features/field-ops/index.ts diff --git a/src/features/monitoring/MonitoringDashboard.tsx b/frontend/src/features/monitoring/MonitoringDashboard.tsx similarity index 100% rename from src/features/monitoring/MonitoringDashboard.tsx rename to frontend/src/features/monitoring/MonitoringDashboard.tsx diff --git a/src/features/monitoring/index.ts b/frontend/src/features/monitoring/index.ts similarity index 100% rename from src/features/monitoring/index.ts rename to frontend/src/features/monitoring/index.ts diff --git a/src/features/patrol/FleetOptimization.tsx b/frontend/src/features/patrol/FleetOptimization.tsx similarity index 100% rename from src/features/patrol/FleetOptimization.tsx rename to frontend/src/features/patrol/FleetOptimization.tsx diff --git a/src/features/patrol/PatrolRoute.tsx b/frontend/src/features/patrol/PatrolRoute.tsx similarity index 100% rename from src/features/patrol/PatrolRoute.tsx rename to frontend/src/features/patrol/PatrolRoute.tsx diff --git a/src/features/patrol/index.ts b/frontend/src/features/patrol/index.ts similarity index 100% rename from src/features/patrol/index.ts rename to frontend/src/features/patrol/index.ts diff --git a/src/features/risk-assessment/EnforcementPlan.tsx b/frontend/src/features/risk-assessment/EnforcementPlan.tsx similarity index 100% rename from src/features/risk-assessment/EnforcementPlan.tsx rename to frontend/src/features/risk-assessment/EnforcementPlan.tsx diff --git a/src/features/risk-assessment/RiskMap.tsx b/frontend/src/features/risk-assessment/RiskMap.tsx similarity index 100% rename from src/features/risk-assessment/RiskMap.tsx rename to frontend/src/features/risk-assessment/RiskMap.tsx diff --git a/src/features/risk-assessment/index.ts b/frontend/src/features/risk-assessment/index.ts similarity index 100% rename from src/features/risk-assessment/index.ts rename to frontend/src/features/risk-assessment/index.ts diff --git a/src/features/statistics/ExternalService.tsx b/frontend/src/features/statistics/ExternalService.tsx similarity index 100% rename from src/features/statistics/ExternalService.tsx rename to frontend/src/features/statistics/ExternalService.tsx diff --git a/src/features/statistics/ReportManagement.tsx b/frontend/src/features/statistics/ReportManagement.tsx similarity index 100% rename from src/features/statistics/ReportManagement.tsx rename to frontend/src/features/statistics/ReportManagement.tsx diff --git a/src/features/statistics/Statistics.tsx b/frontend/src/features/statistics/Statistics.tsx similarity index 100% rename from src/features/statistics/Statistics.tsx rename to frontend/src/features/statistics/Statistics.tsx diff --git a/src/features/statistics/index.ts b/frontend/src/features/statistics/index.ts similarity index 100% rename from src/features/statistics/index.ts rename to frontend/src/features/statistics/index.ts diff --git a/src/features/surveillance/LiveMapView.tsx b/frontend/src/features/surveillance/LiveMapView.tsx similarity index 100% rename from src/features/surveillance/LiveMapView.tsx rename to frontend/src/features/surveillance/LiveMapView.tsx diff --git a/src/features/surveillance/MapControl.tsx b/frontend/src/features/surveillance/MapControl.tsx similarity index 100% rename from src/features/surveillance/MapControl.tsx rename to frontend/src/features/surveillance/MapControl.tsx diff --git a/src/features/surveillance/index.ts b/frontend/src/features/surveillance/index.ts similarity index 100% rename from src/features/surveillance/index.ts rename to frontend/src/features/surveillance/index.ts diff --git a/src/features/vessel/TransferDetection.tsx b/frontend/src/features/vessel/TransferDetection.tsx similarity index 100% rename from src/features/vessel/TransferDetection.tsx rename to frontend/src/features/vessel/TransferDetection.tsx diff --git a/src/features/vessel/VesselDetail.tsx b/frontend/src/features/vessel/VesselDetail.tsx similarity index 100% rename from src/features/vessel/VesselDetail.tsx rename to frontend/src/features/vessel/VesselDetail.tsx diff --git a/src/features/vessel/index.ts b/frontend/src/features/vessel/index.ts similarity index 100% rename from src/features/vessel/index.ts rename to frontend/src/features/vessel/index.ts diff --git a/src/lib/charts/BaseChart.tsx b/frontend/src/lib/charts/BaseChart.tsx similarity index 100% rename from src/lib/charts/BaseChart.tsx rename to frontend/src/lib/charts/BaseChart.tsx diff --git a/src/lib/charts/index.ts b/frontend/src/lib/charts/index.ts similarity index 100% rename from src/lib/charts/index.ts rename to frontend/src/lib/charts/index.ts diff --git a/src/lib/charts/presets/AreaChart.tsx b/frontend/src/lib/charts/presets/AreaChart.tsx similarity index 100% rename from src/lib/charts/presets/AreaChart.tsx rename to frontend/src/lib/charts/presets/AreaChart.tsx diff --git a/src/lib/charts/presets/BarChart.tsx b/frontend/src/lib/charts/presets/BarChart.tsx similarity index 100% rename from src/lib/charts/presets/BarChart.tsx rename to frontend/src/lib/charts/presets/BarChart.tsx diff --git a/src/lib/charts/presets/LineChart.tsx b/frontend/src/lib/charts/presets/LineChart.tsx similarity index 100% rename from src/lib/charts/presets/LineChart.tsx rename to frontend/src/lib/charts/presets/LineChart.tsx diff --git a/src/lib/charts/presets/PieChart.tsx b/frontend/src/lib/charts/presets/PieChart.tsx similarity index 100% rename from src/lib/charts/presets/PieChart.tsx rename to frontend/src/lib/charts/presets/PieChart.tsx diff --git a/src/lib/charts/presets/index.ts b/frontend/src/lib/charts/presets/index.ts similarity index 100% rename from src/lib/charts/presets/index.ts rename to frontend/src/lib/charts/presets/index.ts diff --git a/src/lib/charts/theme.ts b/frontend/src/lib/charts/theme.ts similarity index 100% rename from src/lib/charts/theme.ts rename to frontend/src/lib/charts/theme.ts diff --git a/src/lib/charts/tokens.ts b/frontend/src/lib/charts/tokens.ts similarity index 100% rename from src/lib/charts/tokens.ts rename to frontend/src/lib/charts/tokens.ts diff --git a/src/lib/i18n/config.ts b/frontend/src/lib/i18n/config.ts similarity index 100% rename from src/lib/i18n/config.ts rename to frontend/src/lib/i18n/config.ts diff --git a/src/lib/i18n/index.ts b/frontend/src/lib/i18n/index.ts similarity index 100% rename from src/lib/i18n/index.ts rename to frontend/src/lib/i18n/index.ts diff --git a/src/lib/i18n/locales/en/admin.json b/frontend/src/lib/i18n/locales/en/admin.json similarity index 100% rename from src/lib/i18n/locales/en/admin.json rename to frontend/src/lib/i18n/locales/en/admin.json diff --git a/src/lib/i18n/locales/en/ai.json b/frontend/src/lib/i18n/locales/en/ai.json similarity index 100% rename from src/lib/i18n/locales/en/ai.json rename to frontend/src/lib/i18n/locales/en/ai.json diff --git a/src/lib/i18n/locales/en/auth.json b/frontend/src/lib/i18n/locales/en/auth.json similarity index 100% rename from src/lib/i18n/locales/en/auth.json rename to frontend/src/lib/i18n/locales/en/auth.json diff --git a/src/lib/i18n/locales/en/common.json b/frontend/src/lib/i18n/locales/en/common.json similarity index 100% rename from src/lib/i18n/locales/en/common.json rename to frontend/src/lib/i18n/locales/en/common.json diff --git a/src/lib/i18n/locales/en/dashboard.json b/frontend/src/lib/i18n/locales/en/dashboard.json similarity index 100% rename from src/lib/i18n/locales/en/dashboard.json rename to frontend/src/lib/i18n/locales/en/dashboard.json diff --git a/src/lib/i18n/locales/en/detection.json b/frontend/src/lib/i18n/locales/en/detection.json similarity index 100% rename from src/lib/i18n/locales/en/detection.json rename to frontend/src/lib/i18n/locales/en/detection.json diff --git a/src/lib/i18n/locales/en/enforcement.json b/frontend/src/lib/i18n/locales/en/enforcement.json similarity index 100% rename from src/lib/i18n/locales/en/enforcement.json rename to frontend/src/lib/i18n/locales/en/enforcement.json diff --git a/src/lib/i18n/locales/en/fieldOps.json b/frontend/src/lib/i18n/locales/en/fieldOps.json similarity index 100% rename from src/lib/i18n/locales/en/fieldOps.json rename to frontend/src/lib/i18n/locales/en/fieldOps.json diff --git a/src/lib/i18n/locales/en/patrol.json b/frontend/src/lib/i18n/locales/en/patrol.json similarity index 100% rename from src/lib/i18n/locales/en/patrol.json rename to frontend/src/lib/i18n/locales/en/patrol.json diff --git a/src/lib/i18n/locales/en/statistics.json b/frontend/src/lib/i18n/locales/en/statistics.json similarity index 100% rename from src/lib/i18n/locales/en/statistics.json rename to frontend/src/lib/i18n/locales/en/statistics.json diff --git a/src/lib/i18n/locales/ko/admin.json b/frontend/src/lib/i18n/locales/ko/admin.json similarity index 100% rename from src/lib/i18n/locales/ko/admin.json rename to frontend/src/lib/i18n/locales/ko/admin.json diff --git a/src/lib/i18n/locales/ko/ai.json b/frontend/src/lib/i18n/locales/ko/ai.json similarity index 100% rename from src/lib/i18n/locales/ko/ai.json rename to frontend/src/lib/i18n/locales/ko/ai.json diff --git a/src/lib/i18n/locales/ko/auth.json b/frontend/src/lib/i18n/locales/ko/auth.json similarity index 100% rename from src/lib/i18n/locales/ko/auth.json rename to frontend/src/lib/i18n/locales/ko/auth.json diff --git a/src/lib/i18n/locales/ko/common.json b/frontend/src/lib/i18n/locales/ko/common.json similarity index 100% rename from src/lib/i18n/locales/ko/common.json rename to frontend/src/lib/i18n/locales/ko/common.json diff --git a/src/lib/i18n/locales/ko/dashboard.json b/frontend/src/lib/i18n/locales/ko/dashboard.json similarity index 100% rename from src/lib/i18n/locales/ko/dashboard.json rename to frontend/src/lib/i18n/locales/ko/dashboard.json diff --git a/src/lib/i18n/locales/ko/detection.json b/frontend/src/lib/i18n/locales/ko/detection.json similarity index 100% rename from src/lib/i18n/locales/ko/detection.json rename to frontend/src/lib/i18n/locales/ko/detection.json diff --git a/src/lib/i18n/locales/ko/enforcement.json b/frontend/src/lib/i18n/locales/ko/enforcement.json similarity index 100% rename from src/lib/i18n/locales/ko/enforcement.json rename to frontend/src/lib/i18n/locales/ko/enforcement.json diff --git a/src/lib/i18n/locales/ko/fieldOps.json b/frontend/src/lib/i18n/locales/ko/fieldOps.json similarity index 100% rename from src/lib/i18n/locales/ko/fieldOps.json rename to frontend/src/lib/i18n/locales/ko/fieldOps.json diff --git a/src/lib/i18n/locales/ko/patrol.json b/frontend/src/lib/i18n/locales/ko/patrol.json similarity index 100% rename from src/lib/i18n/locales/ko/patrol.json rename to frontend/src/lib/i18n/locales/ko/patrol.json diff --git a/src/lib/i18n/locales/ko/statistics.json b/frontend/src/lib/i18n/locales/ko/statistics.json similarity index 100% rename from src/lib/i18n/locales/ko/statistics.json rename to frontend/src/lib/i18n/locales/ko/statistics.json diff --git a/src/lib/map/BaseMap.tsx b/frontend/src/lib/map/BaseMap.tsx similarity index 100% rename from src/lib/map/BaseMap.tsx rename to frontend/src/lib/map/BaseMap.tsx diff --git a/src/lib/map/constants.ts b/frontend/src/lib/map/constants.ts similarity index 100% rename from src/lib/map/constants.ts rename to frontend/src/lib/map/constants.ts diff --git a/src/lib/map/hooks/useMapLayers.ts b/frontend/src/lib/map/hooks/useMapLayers.ts similarity index 100% rename from src/lib/map/hooks/useMapLayers.ts rename to frontend/src/lib/map/hooks/useMapLayers.ts diff --git a/src/lib/map/index.ts b/frontend/src/lib/map/index.ts similarity index 100% rename from src/lib/map/index.ts rename to frontend/src/lib/map/index.ts diff --git a/src/lib/map/layers/boundaries.ts b/frontend/src/lib/map/layers/boundaries.ts similarity index 100% rename from src/lib/map/layers/boundaries.ts rename to frontend/src/lib/map/layers/boundaries.ts diff --git a/src/lib/map/layers/heatmap.ts b/frontend/src/lib/map/layers/heatmap.ts similarity index 100% rename from src/lib/map/layers/heatmap.ts rename to frontend/src/lib/map/layers/heatmap.ts diff --git a/src/lib/map/layers/index.ts b/frontend/src/lib/map/layers/index.ts similarity index 100% rename from src/lib/map/layers/index.ts rename to frontend/src/lib/map/layers/index.ts diff --git a/src/lib/map/layers/markers.ts b/frontend/src/lib/map/layers/markers.ts similarity index 100% rename from src/lib/map/layers/markers.ts rename to frontend/src/lib/map/layers/markers.ts diff --git a/src/lib/map/layers/polyline.ts b/frontend/src/lib/map/layers/polyline.ts similarity index 100% rename from src/lib/map/layers/polyline.ts rename to frontend/src/lib/map/layers/polyline.ts diff --git a/src/lib/map/layers/static.ts b/frontend/src/lib/map/layers/static.ts similarity index 100% rename from src/lib/map/layers/static.ts rename to frontend/src/lib/map/layers/static.ts diff --git a/src/lib/map/layers/zones.ts b/frontend/src/lib/map/layers/zones.ts similarity index 100% rename from src/lib/map/layers/zones.ts rename to frontend/src/lib/map/layers/zones.ts diff --git a/src/lib/map/types.ts b/frontend/src/lib/map/types.ts similarity index 100% rename from src/lib/map/types.ts rename to frontend/src/lib/map/types.ts diff --git a/src/lib/theme/colors.ts b/frontend/src/lib/theme/colors.ts similarity index 100% rename from src/lib/theme/colors.ts rename to frontend/src/lib/theme/colors.ts diff --git a/src/lib/theme/index.ts b/frontend/src/lib/theme/index.ts similarity index 100% rename from src/lib/theme/index.ts rename to frontend/src/lib/theme/index.ts diff --git a/src/lib/theme/tokens.ts b/frontend/src/lib/theme/tokens.ts similarity index 100% rename from src/lib/theme/tokens.ts rename to frontend/src/lib/theme/tokens.ts diff --git a/src/lib/theme/variants.ts b/frontend/src/lib/theme/variants.ts similarity index 100% rename from src/lib/theme/variants.ts rename to frontend/src/lib/theme/variants.ts diff --git a/src/main.tsx b/frontend/src/main.tsx similarity index 100% rename from src/main.tsx rename to frontend/src/main.tsx diff --git a/src/services/api.ts b/frontend/src/services/api.ts similarity index 100% rename from src/services/api.ts rename to frontend/src/services/api.ts diff --git a/src/services/event.ts b/frontend/src/services/event.ts similarity index 100% rename from src/services/event.ts rename to frontend/src/services/event.ts diff --git a/src/services/index.ts b/frontend/src/services/index.ts similarity index 100% rename from src/services/index.ts rename to frontend/src/services/index.ts diff --git a/src/services/kpi.ts b/frontend/src/services/kpi.ts similarity index 100% rename from src/services/kpi.ts rename to frontend/src/services/kpi.ts diff --git a/src/services/patrol.ts b/frontend/src/services/patrol.ts similarity index 100% rename from src/services/patrol.ts rename to frontend/src/services/patrol.ts diff --git a/src/services/vessel.ts b/frontend/src/services/vessel.ts similarity index 100% rename from src/services/vessel.ts rename to frontend/src/services/vessel.ts diff --git a/src/services/ws.ts b/frontend/src/services/ws.ts similarity index 100% rename from src/services/ws.ts rename to frontend/src/services/ws.ts diff --git a/src/shared/components/common/DataTable.tsx b/frontend/src/shared/components/common/DataTable.tsx similarity index 100% rename from src/shared/components/common/DataTable.tsx rename to frontend/src/shared/components/common/DataTable.tsx diff --git a/src/shared/components/common/ExcelExport.tsx b/frontend/src/shared/components/common/ExcelExport.tsx similarity index 100% rename from src/shared/components/common/ExcelExport.tsx rename to frontend/src/shared/components/common/ExcelExport.tsx diff --git a/src/shared/components/common/FileUpload.tsx b/frontend/src/shared/components/common/FileUpload.tsx similarity index 100% rename from src/shared/components/common/FileUpload.tsx rename to frontend/src/shared/components/common/FileUpload.tsx diff --git a/src/shared/components/common/NotificationBanner.tsx b/frontend/src/shared/components/common/NotificationBanner.tsx similarity index 100% rename from src/shared/components/common/NotificationBanner.tsx rename to frontend/src/shared/components/common/NotificationBanner.tsx diff --git a/src/shared/components/common/PageToolbar.tsx b/frontend/src/shared/components/common/PageToolbar.tsx similarity index 100% rename from src/shared/components/common/PageToolbar.tsx rename to frontend/src/shared/components/common/PageToolbar.tsx diff --git a/src/shared/components/common/Pagination.tsx b/frontend/src/shared/components/common/Pagination.tsx similarity index 100% rename from src/shared/components/common/Pagination.tsx rename to frontend/src/shared/components/common/Pagination.tsx diff --git a/src/shared/components/common/PrintButton.tsx b/frontend/src/shared/components/common/PrintButton.tsx similarity index 100% rename from src/shared/components/common/PrintButton.tsx rename to frontend/src/shared/components/common/PrintButton.tsx diff --git a/src/shared/components/common/SaveButton.tsx b/frontend/src/shared/components/common/SaveButton.tsx similarity index 100% rename from src/shared/components/common/SaveButton.tsx rename to frontend/src/shared/components/common/SaveButton.tsx diff --git a/src/shared/components/common/SearchInput.tsx b/frontend/src/shared/components/common/SearchInput.tsx similarity index 100% rename from src/shared/components/common/SearchInput.tsx rename to frontend/src/shared/components/common/SearchInput.tsx diff --git a/src/shared/components/common/index.ts b/frontend/src/shared/components/common/index.ts similarity index 100% rename from src/shared/components/common/index.ts rename to frontend/src/shared/components/common/index.ts diff --git a/src/shared/components/ui/badge.tsx b/frontend/src/shared/components/ui/badge.tsx similarity index 100% rename from src/shared/components/ui/badge.tsx rename to frontend/src/shared/components/ui/badge.tsx diff --git a/src/shared/components/ui/card.tsx b/frontend/src/shared/components/ui/card.tsx similarity index 100% rename from src/shared/components/ui/card.tsx rename to frontend/src/shared/components/ui/card.tsx diff --git a/src/stores/enforcementStore.ts b/frontend/src/stores/enforcementStore.ts similarity index 100% rename from src/stores/enforcementStore.ts rename to frontend/src/stores/enforcementStore.ts diff --git a/src/stores/eventStore.ts b/frontend/src/stores/eventStore.ts similarity index 100% rename from src/stores/eventStore.ts rename to frontend/src/stores/eventStore.ts diff --git a/src/stores/gearStore.ts b/frontend/src/stores/gearStore.ts similarity index 100% rename from src/stores/gearStore.ts rename to frontend/src/stores/gearStore.ts diff --git a/src/stores/kpiStore.ts b/frontend/src/stores/kpiStore.ts similarity index 100% rename from src/stores/kpiStore.ts rename to frontend/src/stores/kpiStore.ts diff --git a/src/stores/patrolStore.ts b/frontend/src/stores/patrolStore.ts similarity index 100% rename from src/stores/patrolStore.ts rename to frontend/src/stores/patrolStore.ts diff --git a/src/stores/settingsStore.ts b/frontend/src/stores/settingsStore.ts similarity index 100% rename from src/stores/settingsStore.ts rename to frontend/src/stores/settingsStore.ts diff --git a/src/stores/transferStore.ts b/frontend/src/stores/transferStore.ts similarity index 100% rename from src/stores/transferStore.ts rename to frontend/src/stores/transferStore.ts diff --git a/src/stores/vesselStore.ts b/frontend/src/stores/vesselStore.ts similarity index 100% rename from src/stores/vesselStore.ts rename to frontend/src/stores/vesselStore.ts diff --git a/src/styles/fonts.css b/frontend/src/styles/fonts.css similarity index 100% rename from src/styles/fonts.css rename to frontend/src/styles/fonts.css diff --git a/src/styles/index.css b/frontend/src/styles/index.css similarity index 100% rename from src/styles/index.css rename to frontend/src/styles/index.css diff --git a/src/styles/tailwind.css b/frontend/src/styles/tailwind.css similarity index 100% rename from src/styles/tailwind.css rename to frontend/src/styles/tailwind.css diff --git a/src/styles/theme.css b/frontend/src/styles/theme.css similarity index 100% rename from src/styles/theme.css rename to frontend/src/styles/theme.css diff --git a/src/vite-env.d.ts b/frontend/src/vite-env.d.ts similarity index 100% rename from src/vite-env.d.ts rename to frontend/src/vite-env.d.ts diff --git a/tsconfig.json b/frontend/tsconfig.json similarity index 100% rename from tsconfig.json rename to frontend/tsconfig.json diff --git a/vite.config.ts b/frontend/vite.config.ts similarity index 80% rename from vite.config.ts rename to frontend/vite.config.ts index ce761c1..d28c5b2 100644 --- a/vite.config.ts +++ b/frontend/vite.config.ts @@ -18,4 +18,13 @@ export default defineConfig({ '@stores': path.resolve(__dirname, './src/stores'), }, }, + server: { + port: 5173, + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true, + }, + }, + }, })