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

This commit is contained in:
htlee 2026-03-31 14:25:06 +09:00
커밋 8ff695ca92
9개의 변경된 파일158개의 추가작업 그리고 5개의 파일을 삭제

파일 보기

@ -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
파일 보기

@ -0,0 +1 @@
24

1
.sdkmanrc Normal file
파일 보기

@ -0,0 +1 @@
java=21.0.9-amzn

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
파일 보기

@ -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();