Merge pull request 'release: 2026-03-31 (4건 커밋)' (#5) from develop into main
All checks were successful
Build and Deploy Wing-GIS Frontend / build-and-deploy (push) Successful in 22s
All checks were successful
Build and Deploy Wing-GIS Frontend / build-and-deploy (push) Successful in 22s
This commit is contained in:
커밋
8ff695ca92
@ -47,5 +47,42 @@
|
|||||||
"Read(./**/.env.*)",
|
"Read(./**/.env.*)",
|
||||||
"Read(./**/secrets/**)"
|
"Read(./**/secrets/**)"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"SessionStart": [
|
||||||
|
{
|
||||||
|
"matcher": "compact",
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "bash .claude/scripts/on-post-compact.sh",
|
||||||
|
"timeout": 10
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"PreCompact": [
|
||||||
|
{
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "bash .claude/scripts/on-pre-compact.sh",
|
||||||
|
"timeout": 30
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"PostToolUse": [
|
||||||
|
{
|
||||||
|
"matcher": "Bash",
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "bash .claude/scripts/on-commit.sh",
|
||||||
|
"timeout": 15
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,5 +2,6 @@
|
|||||||
"applied_global_version": "1.6.1",
|
"applied_global_version": "1.6.1",
|
||||||
"applied_date": "2026-03-31",
|
"applied_date": "2026-03-31",
|
||||||
"project_type": "react-ts",
|
"project_type": "react-ts",
|
||||||
"custom_pre_commit": true
|
"custom_pre_commit": true,
|
||||||
|
"gitea_url": "https://gitea.gc-si.dev"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,12 +27,17 @@ jobs:
|
|||||||
working-directory: frontend/wing-gis-web
|
working-directory: frontend/wing-gis-web
|
||||||
run: npm ci
|
run: npm ci
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
working-directory: frontend/wing-gis-web
|
||||||
|
run: npm run lint
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
working-directory: frontend/wing-gis-web
|
working-directory: frontend/wing-gis-web
|
||||||
run: npm run build
|
run: npm run build
|
||||||
|
|
||||||
- name: Deploy to server
|
- name: Deploy to server
|
||||||
run: |
|
run: |
|
||||||
|
mkdir -p /deploy/wing-gis
|
||||||
rm -rf /deploy/wing-gis/*
|
rm -rf /deploy/wing-gis/*
|
||||||
cp -r frontend/wing-gis-web/dist/* /deploy/wing-gis/
|
cp -r frontend/wing-gis-web/dist/* /deploy/wing-gis/
|
||||||
echo "Deployed at $(date '+%Y-%m-%d %H:%M:%S')"
|
echo "Deployed at $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
|||||||
1
.node-version
Normal file
1
.node-version
Normal file
@ -0,0 +1 @@
|
|||||||
|
24
|
||||||
92
CLAUDE.md
Normal file
92
CLAUDE.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# WING-GIS - 해양경찰청 통합 GIS 위치정보시스템
|
||||||
|
|
||||||
|
모노레포 구조: React 19 TypeScript 프론트엔드 + Spring Boot 3.3 Java 21 백엔드 (MSA)
|
||||||
|
해양 GIS 시스템으로 선박 물표 추적(AIS/V-Pass/VTS 등 7개 소스), S-100 전자해도, 공간분석 기능 제공.
|
||||||
|
|
||||||
|
상세 아키텍처: [ARCHITECTURE.md](ARCHITECTURE.md) 참조
|
||||||
|
|
||||||
|
## 기술 스택
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
- React 19 + TypeScript 5.9 + Vite 8
|
||||||
|
- MapLibre GL JS 5.18 + deck.gl 9.2 (해양 지도 렌더링)
|
||||||
|
- Zustand 5 (상태 관리), Ant Design 6 (UI), STOMP.js (WebSocket)
|
||||||
|
- ENC: Martin 타일 서버 연동, S-52 day/dusk/night 테마
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
- Spring Boot 3.3.6 + Java 21 + Gradle 9.3.1
|
||||||
|
- PostgreSQL 16/PostGIS 3.4, Hibernate Spatial
|
||||||
|
- Redis (캐시), Kafka (선박 스트리밍), Keycloak (SSO)
|
||||||
|
- MapStruct (DTO 매핑), SpringDoc OpenAPI 2.3 (API 문서)
|
||||||
|
|
||||||
|
### Infrastructure
|
||||||
|
- Docker Compose (PostgreSQL, Redis, Kafka, MinIO, pg_tileserv, Keycloak)
|
||||||
|
- npm 레지스트리: https://nexus.gc-si.dev/repository/npm-public/
|
||||||
|
|
||||||
|
## 빌드 명령어
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
```bash
|
||||||
|
cd frontend/wing-gis-web
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Backend (wing-gis-map 서비스)
|
||||||
|
```bash
|
||||||
|
cd services/wing-gis-map
|
||||||
|
./gradlew build
|
||||||
|
```
|
||||||
|
|
||||||
|
## 개발 서버
|
||||||
|
```bash
|
||||||
|
cd frontend/wing-gis-web
|
||||||
|
npm run dev # http://localhost:5174
|
||||||
|
```
|
||||||
|
|
||||||
|
## 테스트
|
||||||
|
```bash
|
||||||
|
# Frontend (테스트 러너 미설정)
|
||||||
|
# Backend
|
||||||
|
cd services/wing-gis-map && ./gradlew test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Lint
|
||||||
|
```bash
|
||||||
|
# Frontend (ESLint 9, flat config)
|
||||||
|
cd frontend/wing-gis-web && npm run lint
|
||||||
|
# Prettier: 미설정
|
||||||
|
# Backend: checkstyle/spotless 미설정
|
||||||
|
```
|
||||||
|
|
||||||
|
## 디렉토리 구조
|
||||||
|
```
|
||||||
|
wing-gis/
|
||||||
|
├── frontend/wing-gis-web/ # React SPA
|
||||||
|
│ └── src/
|
||||||
|
│ ├── components/ # layout, map, vessel UI
|
||||||
|
│ ├── features/ # vesselLayer, nauticalChart
|
||||||
|
│ ├── hooks/ # useStore, useMap, useDeckLayers, useVesselStream
|
||||||
|
│ ├── lib/map/ # mapCore, MaplibreDeckCustomLayer
|
||||||
|
│ ├── services/ # api.ts, vesselApi.ts
|
||||||
|
│ ├── types/ # ais.ts, vessel.ts, layer.ts
|
||||||
|
│ └── utils/ # coordinate, s52Colors, vesselIcon
|
||||||
|
├── services/ # Spring Boot MSA (10개)
|
||||||
|
│ ├── wing-gis-map/ # GIS API (구현 완료)
|
||||||
|
│ ├── wing-gis-vessel/ # 선박/신호 (stub)
|
||||||
|
│ ├── wing-gis-gateway/ # API Gateway (stub)
|
||||||
|
│ ├── wing-gis-auth/ # 인증 (stub)
|
||||||
|
│ ├── wing-gis-layer/ # 레이어 관리 (stub)
|
||||||
|
│ ├── wing-gis-analysis/ # 분석 (stub)
|
||||||
|
│ ├── wing-gis-integration/ # 연계 (stub)
|
||||||
|
│ ├── wing-gis-admin/ # 관리 (stub)
|
||||||
|
│ └── wing-gis-mcp/ # MCP Agent (stub)
|
||||||
|
├── infra/ # Docker Compose, K8s, SQL
|
||||||
|
├── docs/ # 문서
|
||||||
|
└── .claude/ # Claude Code 설정
|
||||||
|
```
|
||||||
|
|
||||||
|
## 팀 컨벤션
|
||||||
|
- `.claude/rules/` 팀 코딩 표준 참조 (`/sync-team-workflow`로 다운로드)
|
||||||
|
- 커밋 메시지: Conventional Commits (한국어), `.githooks/commit-msg`로 검증
|
||||||
|
- 커밋 전 lint 검증 필수
|
||||||
16
docs/RELEASE-NOTES.md
Normal file
16
docs/RELEASE-NOTES.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Release Notes
|
||||||
|
|
||||||
|
이 문서는 [Keep a Changelog](https://keepachangelog.com/ko/1.0.0/) 형식을 따릅니다.
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [2026-03-31]
|
||||||
|
|
||||||
|
### 수정
|
||||||
|
- CI/CD 배포 워크플로우 개선: 배포 디렉토리 자동 생성(mkdir -p), lint 검증 단계 추가
|
||||||
|
- ESLint 에러 수정: useEffect 내 직접 setState 호출 제거, 렌더 중 ref 업데이트를 useEffect로 이동
|
||||||
|
|
||||||
|
### 기타
|
||||||
|
- 팀 워크플로우 초기 구성: CLAUDE.md, .sdkmanrc(Java 21), .node-version(24) 추가
|
||||||
|
- settings.json hooks 섹션 추가, workflow-version.json gitea_url 필드 추가
|
||||||
|
- NEXUS_NPM_AUTH 시크릿 등록
|
||||||
@ -50,9 +50,6 @@ export function useVesselDeckLayer(
|
|||||||
const renderer = aisRendererRef.current;
|
const renderer = aisRendererRef.current;
|
||||||
if (renderer) {
|
if (renderer) {
|
||||||
renderer.setData(features);
|
renderer.setData(features);
|
||||||
} else {
|
|
||||||
// Renderer not ready yet, set directly
|
|
||||||
setRenderedAis(features);
|
|
||||||
}
|
}
|
||||||
}, [aisTargets]);
|
}, [aisTargets]);
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,10 @@ const RETENTION_MS = 120 * 60 * 1000;
|
|||||||
export function useAisPolling() {
|
export function useAisPolling() {
|
||||||
const setAisTargets = useStore((s) => s.setAisTargets);
|
const setAisTargets = useStore((s) => s.setAisTargets);
|
||||||
const storeRef = useRef(useStore.getState);
|
const storeRef = useRef(useStore.getState);
|
||||||
storeRef.current = useStore.getState;
|
|
||||||
|
useEffect(() => {
|
||||||
|
storeRef.current = useStore.getState;
|
||||||
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const ac = new AbortController();
|
const ac = new AbortController();
|
||||||
|
|||||||
불러오는 중...
Reference in New Issue
Block a user