kcg-monitoring/docs/RELEASE-NOTES.md

208 lines
11 KiB
Markdown
Raw Blame 히스토리

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Release Notes
이 문서는 [Keep a Changelog](https://keepachangelog.com/ko/1.0.0/) 형식을 따릅니다.
## [Unreleased]
## [2026-03-24.2]
### 추가
- 선단/어구그룹 폴리곤 서버사이드 생성: Shapely convex hull + buffer → PostGIS 저장
- DB migration 009: group_polygon_snapshots 테이블 (5분 APPEND, 7일 보존)
- Backend API: GET /api/vessel-analysis/groups (목록/상세/히스토리)
- useGroupPolygons 훅: 5분 폴링 (fleet/gearInZone/gearOutZone)
### 변경
- FleetClusterLayer: 클라이언트 convexHull/padPolygon 제거 → API GeoJSON 직접 렌더링
- 프론트 어구그룹 탐지(regex+거리 클러스터링) Python 이관
### 수정
- 불법어선 탭 복원 (임시 숨김 해제)
## [2026-03-24.1]
### 추가
- 웹폰트 내장: @fontsource-variable Inter, Noto Sans KR, Fira Code 자체 호스팅
- 폰트 상수 파일 (FONT_MONO, FONT_SANS) + 타입 선언
### 변경
- 전체 font-family 통일: CSS 55곳 + deck.gl TextLayer 30곳 + 인라인 스타일 8곳
- 이란 시설물 색상 사막 대비 고채도 팔레트 교체 (amber/orange/yellow → rose/sky/cyan/lime)
- 이란 시설 라벨 fontWeight 600→700, alpha 200→255 (가독성 개선)
- 접힘 패널 상하 패딩 균일화 (area-ship-header :last-child)
## [2026-03-24]
### 추가
- LayerPanel 공통 트리 구조: LayerTreeNode 재귀 렌더러 (한국/이란 양쪽 적용)
- 위험시설/해외시설 emoji→SVG IconLayer 전환 (12 SVG 함수, hazard/CN/JP 3개 IconLayer)
- S&P Global 피격 선박 27척 데이터 (damagedShips.ts)
- 이란 리플레이 실데이터 전환: Backend 시점 조회 API + Events CRUD
- GeoEvent `sea_attack` 타입 + SEA ATK 배지 (피격 선박 이벤트 로그 통합)
- 더미↔API 토글 UI (리플레이 배속 우측)
- 대시보드 탭 localStorage 영속화
- 지도 글꼴 크기 커스텀: 시설/선박/분석/지역 4그룹 슬라이더 (0.5~2.0x, LAYERS 하단)
### 변경
- 부모 노드 토글→하위 전체 ON/OFF 캐스케이드 + 카운트 합산
- useIranData dataSource 분기 (dummy=sampleData, api=Backend DB 3월1일~오늘)
- fetchAircraftByRange, fetchOsintByRange, fetchEventsByRange 서비스 함수
## [2026-03-23]
### 추가
- 해외시설 레이어: 위험시설(원전/화학/연료저장) + 중국·일본 발전소/군사시설
- 현장분석 Python 연동 + FieldAnalysisModal (어구/선단 분석 대시보드)
- 이란 시설 deck.gl SVG 전환: 26개 고유 SVG 아이콘 (IconLayer + TextLayer)
- 중동 에너지/위험시설 데이터 84개 (meEnergyHazardFacilities)
- 환적탐지 Python 이관: 서버사이드 그리드 공간인덱스 O(n log n)
- 중국어선감시 탭: CN 어선 + 어구 패턴 필터링, 조업수역 폴리곤
- AI 해양분석 챗 UI (AiChatPanel, placeholder)
- localStorage 기반 레이어/필터 상태 영속화 (13개 항목)
### 변경
- App.tsx 분해: IranDashboard + KoreaDashboard 추출 (771줄→163줄)
- useStaticDeckLayers 분할: 레이어별 서브훅 4개
- DOM Marker → deck.gl 전환 + 줌 스케일 연동
- 한국 군사/정부/NK 아이콘: emoji → SVG IconLayer (19종)
- 선박 카테고리/국적 토글: MapLibre GPU-side filter 표현식
- LIVE 모드 currentTime 의존성 분리 → 매초 재계산 제거
- 시설 라벨 SDF 테두리 적용 (fontSettings.sdf + outlineWidth)
### 수정
- LIVE 모드 렌더링 최적화: useMonitor 1초 setInterval 제거
- 특정어업수역 실제 폴리곤 좌표 적용 (EPSG:3857→WGS84 변환)
- DB migration 008 적용 (AI 분석 API 500 에러 해결)
- 불법어선 탭 복원 + ShipLayer feature-state 필터 에러 수정
- prediction 증분 수집 버그 수정
## [2026-03-20]
### 변경
- deck.gl 전면 전환: DOM Marker → GPU 렌더링 (WebGL)
- 정적 마커 11종 deck.gl 전환 + 줌 레벨별 스케일
### 추가
- NK 미사일 궤적선 + 정적 마커 Popup + 어구 강조
- Python 분석 결과 오버레이: 위험도 마커 + 다크베셀/GPS 스푸핑 경고
- AI 분석 통계 패널 (우상단, 접이식): 분석 대상/위험/다크/선단 집계
- 불법어선/다크베셀/중국어선감시 Python 분석 연동
- Backend vessel-analysis REST API + DB 테이블 복원
- 특정어업수역 ~Ⅳ 실제 폴리곤 기반 수역 분류
### 수정
- 해저케이블 날짜변경선 좌표 보정 + 렌더링 성능 개선
## [2026-03-19]
### 추가
- OpenSky OAuth2 Client Credentials 인증 (토큰 자동 갱신)
### 변경
- OpenSky 수집 주기 60초 → 300초 (일일 크레딧 소비 11,520 → 2,304)
- 인라인 CSS 정리 — 공통 클래스 추출 + Tailwind 전환
### 수정
- OSINT 기사 중복 수집 방지: title 기반 24h 중복 체크 추가 (GDELT/Google News)
- MapLibre symbol layer race condition 해소: hover를 feature-state로 분리, ships-korean-label visibility 제어로 변경
## [2026-03-18]
### 추가
- OSINT 수집기: GDELT + Google News RSS 백엔드 수집 (@Scheduled 2분)
- Satellite 수집기: CelesTrak TLE 백엔드 수집 (@Scheduled 10분)
- `GET /api/osint?region=iran|korea`, `GET /api/satellites?region=iran|korea` REST API
- Caffeine 캐시 TTL 2일 (Aircraft 포함 전체 통일)
- DB 마이그레이션: `ship_positions`, `osint_feeds`, `satellite_tle` 테이블 + 샘플 데이터
- 프론트엔드 OSINT/위성 데이터 백엔드 API 우선 호출 + 직접 호출 fallback
- 지진파 수집기: USGS FDSN API, 이란 bbox(M2+), 5분 주기
- 기압 수집기: Open-Meteo API, 이란 5개 관측점, 10분 주기
- DB: seismic_events, pressure_readings 테이블 (마이그레이션 004)
- REST: GET /api/sensor/seismic, GET /api/sensor/pressure
- 센서 API 서비스(sensorApi.ts): 백엔드 지진/기압 실데이터 연동
- 선박 모달 S&P Global 다중 사진 슬라이드 (좌우 화살표 + 인디케이터)
- 선박 모달 드래그 이동 (헤더 영역 grab)
- LiveControls KST/UTC 라디오 버튼 그룹
- 한국 선박 현황 헤더 ON/OFF 토글 → 지도 강조 링+라벨 표시 (기본 ON)
- 우측 패널 한국 선박 목록: hover 시 지도 강조 링, 클릭 시 선박 모달 호출
- 지진 포인트 클릭 → 지도 flyTo + SeismicMarker 진도별 펄스 원형 영향범위 표시
- SatelliteMap flyTo 지원
### 변경
- 프론트엔드 패키지 구조 리팩토링: components/ → common/layers/iran/korea/ 분리
- App.tsx 분해: 1,179줄 → 588줄 (useIranData, useKoreaData, useKoreaFilters 훅 추출)
- SensorChart: 더미 → 실데이터(지진/기압), x축 동적 시간 표시
- SensorChart 그래프 순서: 지진파 → 기압 → 소음(DEMO) → 방사선(DEMO)
- 히스토리 프리셋: 1H/2H/3H/6H (최소 1시간, 8칸 구조)
- 센서 API 파라미터: hours → min (기본 2880=48h)
- 센서 데이터 polling: 초기 48h 전체 → 10분마다 incremental merge
- 선박 데이터 polling: 초기 60분 → 5분마다 6분 윈도우 merge + 60분 stale 제거
- 선박 모달 고정 크기(300px) + 사진 영역 고정(160px, object-contain)
- 선박 모달 데이터 레이아웃: 2컬럼 그리드 + 연관 정보 쌍 배치 + 긴 값 단독행
- 선박 모달 CSS 통일 (태그 패딩/배경, 컬럼 간격 12px)
- 선박 모달 사진 탭: S&P Global 명칭, 고화질(_2) 기본 표시
- Overpass API 외부 호출 제거 → 정적 인프라 데이터
- 지진파 그래프: LineChart → ScatterChart (진도별 색상/크기, 이벤트 점 표시)
- 기압 그래프: 해수면 기압 보정(SLP), 관측소별 개별 라인, 원본 포인트 기반 렌더링
- 그래프 데이터 범위: 표시 범위보다 1칸 확장 (y축 시작점 연결)
- Tooltip: KST 시간 포맷, 상단 고정, 전체 스타일 통일
- OilFacilityLayer: planned ring SVG 내부 이동 (아이콘 중심 정렬)
- 밝은 테마: 지도 라벨 text-shadow CSS 변수 분리
### 수정
- 002 마이그레이션 search_path에 public 추가 (PostGIS 타입 참조)
- LiveControls KST 시간 이중 오프셋(+9h×2) 수정 + KST/UTC 토글
- nginx /shipimg/ 프록시: ^~ 추가 (정적파일 regex 우선매칭 방지)
- 센서 API(/api/sensor/*) 인증 예외 처리 (공개 데이터)
- 선박 모달 열 때마다 S&P Global 우선 탭 리셋 (MarineTraffic 포커스 유지 버그)
- S&P Global 사진 URL: IMO 기반 이미지 목록 API 연동 (잘못된 번호 패턴 제거)
- deploy.yml: SSH SCP+실행 각 3회 재시도 (kex_exchange 거부 대응)
### 기타
- 로그인 화면 KCG 로고에 DEMO 문구 오버레이
## [2026-03-17]
### 추가
- 프론트엔드 모노레포 이관 (`frontend/` 폴더 구조)
- signal-batch API 연동 (한국 선박 실시간 위치 데이터)
- Tailwind CSS 4 + CSS 변수 테마 시스템 (dark/light)
- i18next 다국어 지원 (ko/en) — 28개 컴포넌트 적용
- 레이어 패널 트리 구조 재설계 (카테고리별 온/오프, 접이식 범례)
- Google OAuth 로그인 + DEV LOGIN 인증 우회 (개발 모드)
- 선박 이미지 탭 전환 UI (signal-batch / MarineTraffic)
- 백엔드 Spring Boot 3.2 스켈레톤 (JDK 21)
- Google OAuth + JWT 인증 API (`@gcsc.co.kr` 도메인 제한)
- 백엔드 항공기 수집기 (Airplanes.live + OpenSky, @Scheduled 60초 주기)
- 인메모리 캐시 + PostGIS DB 적재 (향후 리플레이 지원)
- `GET /api/aircraft?region=iran|korea` REST API
- DB 마이그레이션: `aircraft_positions` 테이블 (geometry + GiST 인덱스)
- 헤더 우측 사용자 프로필/이름 + 로그아웃 버튼
- 로그인 화면 KCG 로고 적용 (kcg.svg)
- 브라우저 탭 favicon/제목 변경 (kcg-dashboard-demo)
- PostgreSQL 스키마 (events, news, osint, users, login_history)
- Python FastAPI 분석서버 placeholder
- Gitea Actions CI/CD 파이프라인 (main merge 시 자동 배포)
- nginx 설정 (SPA + API 프록시 + 외부 API CORS 프록시)
- systemd 서비스 (kcg-backend, JDK 21, 2~4GB 힙)
### 수정
- 항공기 API 폴링 주기 15초/25초 → 60초 (Rate Limit 대응)
- CORS: CorsFilter 최우선 순위 등록 (프로덕션 도메인 허용)
- 프로덕션 빌드 시 console/debugger 자동 제거
- CI/CD 워크플로우 전면 재구성: act 컨테이너(node:24) 환경 대응
- CI 빌드 실패 해결: `@rollup/rollup-darwin-arm64` 직접 의존성 제거
- 모노레포 pre-commit hook `frontend/` 디렉토리 기준 실행
### 변경
- JDK 17 → 21 업그레이드 (pom.xml, sdkmanrc, CI/CD, systemd)
- 프론트엔드 REPLAY 모드: 외부 API 호출 제거, 샘플 데이터 전용
- 프론트엔드 airplaneslive.ts / opensky.ts 삭제 (백엔드로 대체)
- Vite 프록시에서 airplaneslive / opensky 항목 제거
- deploy.yml: Gitea secrets → .env 파일로 백엔드 환경변수 배포
- systemd/nginx: 배포 경로 /devdata/services/kcg/ 반영
- 외부 API 호출 CORS 프록시 전환 (Airplanes.live, OpenSky, CelesTrak)
- App.css 하드코딩 색상 → CSS 변수 토큰 전환 (테마 반응)
- 선박 분류 체계 AIS shipTy 파싱 개선
- 한국 선박 데이터 폴링 주기 15초 → 4분