커밋 그래프

58 커밋

작성자 SHA1 메시지 날짜
7b13977b50 chore: 메모리 문서 업데이트 및 사용하지 않는 변수 정리
- memory/MEMORY.md: 현재 상태 업데이트 (커밋 4c7bd42b 반영)
- memory/maplibre-migration-status.md: 최종 커밋 정보 추가
- 사용하지 않는 catch 변수 제거 (4개 파일)
- ESLint 경고: 35개 → 31개

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 17:34:23 +09:00
4c7bd42b42 refactor: 관심구역, 측정, 미니맵 MapLibre 전환 + OpenLayers 제거 (Session E, F, H)
- Session E: 관심구역 폴리곤 + 추적 반경원 MapLibre GeoJSON 레이어로 전환
  - useRealmLayer: OL VectorLayer → MapLibre fill/line layer
  - useTrackingMode: 반경 원 @turf/circle → GeoJSON source
- Session F: 측정 도구 MapLibre 커스텀 구현
  - useMeasure: OL Draw/Overlay → MapLibre Marker + GeoJSON layer
  - 거리/면적: @turf/distance, @turf/length, @turf/area
  - 툴 믹싱 지원, 세션 persistence
- Session H: 미니맵 MapLibre 전환 + OpenLayers 완전 제거
  - VesselDetailModal/StsContactDetailModal: OL 임베디드 맵 → MapLibre 7개 레이어
  - mapStore: map 타입 any → maplibregl.Map | null
  - csvDownload: OL Polygon → Turf.js booleanPointInPolygon
  - package.json: ol, ol-ext 제거 (~500KB 감소)
  - main.tsx: OL CSS 제거
  - 6개 OL 파일 @ts-nocheck 추가 (Session G 패스)

검증: yarn type-check, yarn lint, yarn build 통과

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-15 17:28:24 +09:00
2a7f1af6d2 refactor: 관심구역 폴리곤 + 추적 반경원 MapLibre 전환 (Session E)
- useRealmLayer: OL VectorLayer → MapLibre GeoJSON source + fill/line/symbol layer
  - data-driven expression으로 개별 스타일링 (fillColor, outlineColor, isDotted)
  - line-dasharray data-driven 미지원 → 실선/점선 레이어 분리
  - style.load 이벤트로 배경지도 전환 후 레이어 자동 복구
- useTrackingMode: @turf/circle 기반 반경 원 시각화 추가
  - trackingModeStore subscribe로 선박 이동/반경 변경에 동기화
  - style.load 복구 패턴 적용
- baseLayer: glyphs URL 추가 (symbol layer 텍스트 렌더링용)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 13:15:37 +09:00
96ee263b1e refactor: OpenLayers → MapLibre GL JS 코어 전환 (Session C)
메인 지도 엔진을 OpenLayers에서 MapLibre GL JS 5.18.0으로 전환.
Deck.gl 통합을 수동 캔버스 오버레이에서 @deck.gl/mapbox MapboxOverlay로 단순화.

주요 변경:
- maplibregl.Map + MapboxOverlay(자동 뷰 동기화) 기반 재구성
- OL EPSG:3857 좌표 변환 → MapLibre LngLat(4326) 직접 사용
- 줌 규약: mapStore.zoom = OL 규약 유지 (MapLibre zoom + 1)
- OL 전용 코드에 MapLibre 가드 패턴 적용 (getCanvas 체크)
- 커서 관리: default → pointer(호버) → grabbing(드래그)

신규: projection.ts | 재작성: baseLayer, useShipLayer, MapContainer, useTrackingMode
패치: mapStore, shipLayer, TopBar, useShipSearch, useRealmLayer, useMeasure,
      useZoneDraw, useZoneEdit, ReplayWebSocketService, TrackQueryViewer 외

미동작(후속 세션): 측정(F), 관심구역(E), 반경원(E), 구역편집(G), 미니맵(H)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 12:49:08 +09:00
4c291bb08f docs: CLAUDE.md 기술 스택 버전 업데이트 (Step 1 완료 반영)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 11:38:43 +09:00
3060973f92 chore: React 19 + Vite 7 + ESLint 9 + Zustand 5 업그레이드
- React 18.2 → 19.2.4, react-dom 19.2.4
- Vite 5.2.10 → 7.3.1, @vitejs/plugin-react 5.1.4
- ESLint 8.44 → 9.39.2 flat config, typescript-eslint 8.55.0
- eslint-plugin-react-hooks 7.0.1 (신규 규칙 warn 설정)
- Zustand 4.5 → 5.0.11 (shallow → useShallow 마이그레이션)
- sass 1.77.8 → 1.97.3
- sockjs-client, flatgeobuf 미사용 패키지 제거
- react-router-dom v7 future flag 적용
- vite.config.ts: defineConfig 함수형, build.target: es2022

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 11:37:37 +09:00
fb922fa793 docs: CLAUDE.md TypeScript 전환 및 Phase 3 계획 반영
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 11:05:47 +09:00
6e3ad9e0d8 chore: JavaScript → TypeScript 전환 완료 (77개 파일)
JS/JSX 77개 파일을 TS/TSX로 전환하고 JS 원본을 삭제.
- stores 7개, map core 6개, hooks 4개 등 전체 모듈 전환
- TypeScript strict 모드, OL/Deck.gl 타입 적용
- .gitignore에서 TS/TSX 무시 규칙 제거
- pre-commit hook: .js,.jsx → .ts,.tsx 확장자 변경
- tsc --noEmit 0 에러, ESLint 0 에러, yarn build 성공

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 10:28:27 +09:00
2d871306ed feat: 선종 필터 패널 재구현 + signalKindCode 백엔드 응답 우선
- ShipFilterPanel: 선종별 표시/숨김 토글 (전체 ON/OFF 포함)
- Sidebar gnb1에 ShipFilterPanel 연결
- aisTargetApi: 백엔드 signalKindCode 필드 우선, 없으면 vesselType fallback

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 07:21:37 +09:00
3439407b71 fix: 외부 환경 호환 (OSM 타일, AIS 프록시, Node 20)
- 내부망 타일서버 → OSM + CartoDB Dark Matter 전환
- 내부망 API 프록시 제거, /snp-api 프록시만 유지
- AIS API CORS 해결 (Vite 프록시 경유)
- useFavoriteData 비활성화 (/api/gis 내부망 의존 제거)
- .node-version: 20 (팀 템플릿 기준), .nvmrc 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 07:02:22 +09:00
b9c0b70e06 fix: kcgv.svg 복원 (gov.svg 복사본으로 빌드 에러 해결)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 06:28:37 +09:00
ac3c204843 refactor: 민간화 + 팀 프로젝트 구조 전환
- 해경 관련 코드/에셋 정리 (KCGV, 해경관할구역 FGB, PatrolShipSelector)
- 위성/기상/퍼블리시/레거시 모듈 전체 삭제
- STOMP WebSocket → AIS Target API HTTP 폴링 방식 전환
- 세션 인증 임시 비활성화 (VITE_DEV_SKIP_AUTH)
- 환경변수 민간 데모용으로 재구성
- 팀 워크플로우 v1.2.0 구조 적용 (.claude/rules, skills, settings)
- .githooks, .editorconfig, .node-version 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 06:13:08 +09:00
LHT
086599bb6d fix: class → className JSX 속성 수정
- publish/pages 및 component/wrap 하위 12개 컴포넌트의 class 속성을 className으로 변환

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 13:54:56 +09:00
LHT
8ccb261d65 feat: 해경관할구역 FGB 레이어 + 필터 개인설정 영속화 (AI모드/위험물)
- useCoastGuardLayer: flatgeobuf 해경관할구역 레이어 (테마별 스타일)
- userSettingApi: 필터 개인설정 저장/불러오기 API
- applyFilterSettings/buildFilterSettings에 AI모드(6개 서브) + 위험물 추가
- AI모드 전체 토글: 선종/국적/신호와 동일 every 패턴으로 통일
- DisplayComponent: AI모드/위험물/해경관할구역/관심구역 토글 바인딩
- 해경관할구역 기본값 ON

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 13:54:46 +09:00
LHT
059b0670fc feat: 관심선박 필터/강조 레이어 + 관심구역 폴리곤 표시
- favoriteApi: 관심선박/관심구역 API 연동
- favoriteStore: favoriteSet(O(1) lookup), realmList 상태 관리
- ShipBatchRenderer: 관심선박 필터 우선 통과 + 밀도 제한 최우선
- shipLayer: 관심선박 위치에 ico_favship.svg 강조 IconLayer 오버레이
- useRealmLayer: 관심구역 OpenLayers 폴리곤(이름/색상/윤곽선) 렌더링
- useShipLayer: favoriteStore 변경 시 즉시 리렌더 구독

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 13:54:32 +09:00
LHT
de2cd907f1 feat: 로그인 세션 통합 (인증 가드, fetchWithAuth, 환경변수)
- authStore: 메인 프로젝트 세션 쿠키 기반 인증 상태 관리
- fetchWithAuth: 401 응답 시 메인 프로젝트 로그인 페이지 리다이렉트
- SessionGuard: 앱 진입 시 세션 유효성 검증 래퍼 컴포넌트
- 기존 API 모듈 fetch → fetchWithAuth 전환
- 환경변수에 VITE_MAIN_APP_URL, VITE_DEV_SKIP_AUTH 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 13:54:21 +09:00
LHT
34d5f6ef9e Merge branch 'feature/area-search' into develop 2026-02-12 06:27:34 +09:00
LHT
1c36789612 Merge remote-tracking branch 'origin/feat/weather' into develop
# Conflicts:
#	src/components/layout/Sidebar.jsx
#	src/map/MapContainer.jsx
2026-02-12 06:27:26 +09:00
LHT
4945606c1c feat: STS 분석 기능 구현 및 항적분석 고도화
- STS(Ship-to-Ship) 접촉 분석 기능 전체 구현
  - API 연동 (vessel-contacts), 스토어, 레이어 훅, 레이어 레지스트리
  - 접촉 쌍 그룹핑, 그룹 카드 목록, 상세 모달 (그리드 레이아웃)
  - ScatterplotLayer 접촉 포인트 + 위험도 색상
- 항적분석 탭 UI 분리 (구역분석 / STS분석)
  - AreaSearchPage → AreaSearchTab, StsAnalysisTab 추출
  - 탭 전환 시 결과 초기화 확인, 구역 클리어
- 지도 호버 하이라이트 구현 (구역분석 + STS)
  - MapContainer pointermove에 STS 레이어 ID 핸들러 추가
  - STS 쌍 항적 동시 하이라이트 (vesselId → groupIndex 매핑)
  - 목록↔지도 호버 연동 자동 스크롤
  - pickingRadius 12→20 확대
- 재생 컨트롤러(AreaSearchTimeline) STS 지원
  - 항적/궤적 토글 activeTab 기반 스토어 분기
  - 닫기 시 양쪽 스토어 + 레이어 정리
- 패널 닫기 초기화 수정 (isOpen 감지, clearResults로 탭 보존)
- 조회 중 로딩 오버레이 (LoadingOverlay 공통 컴포넌트)
- 항적분석 다중 방문 대응, 선박 상세 모달, 구역 편집 기능
- trackLayer updateTriggers Set 직렬화, highlightedVesselIds 지원

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 06:20:46 +09:00
jeonghyo.K
81255c4839 추가 수정사항 반영
1. 페이지네이션, 스크롤, 날짜 선택 ui 추가
2. 공통코드 조회 api 적용 (위성 조회, 등록 팝업 등)
3. 필수값 입력 메세지 추가
2026-02-11 16:49:26 +09:00
jeonghyo.K
1c991d8229 위성 오타 수정 2026-02-11 13:51:15 +09:00
jeonghyo.K
e79c50baea 위성 메뉴 개발 2026-02-11 13:46:36 +09:00
jeonghyo.K
a0a7f19e58 기상 메뉴 개발
1. 각 탭의 컴포넌트 개발
2. api 연결 및 화면 표출 추가
2026-02-10 13:15:12 +09:00
ecfc25edde Merge branch 'feature/area-search' into 'develop'
feat: 항적분석(구역 검색) 기능 구현

See merge request mda/kcgv-react-frontend!1
2026-02-10 03:31:28 +00:00
LHT
5d7a45984a chore: 환경변수 파일 초기 등록
빌드 환경별 .env 파일 1회성 추가 (gitignore 유지)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:30:28 +09:00
LHT
dcf24e96d2 feat: 항적분석(구역 검색) 기능 구현
구역 기반 선박 항적 검색 기능 추가. 사용자가 지도에 최대 3개 구역을
그리고 ANY/ALL/SEQUENTIAL 조건으로 해당 구역을 통과한 선박의 항적을
조회·재생할 수 있다.

신규 패키지 (src/areaSearch/):
- stores: areaSearchStore, areaSearchAnimationStore (재생 제어)
- services: areaSearchApi (REST API + hitDetails 타임스탬프/위치 보간)
- components: AreaSearchPage, ZoneDrawPanel, AreaSearchTimeline, AreaSearchTooltip
- hooks: useAreaSearchLayer (Deck.gl 레이어), useZoneDraw (OL Draw)
- utils: areaSearchLayerRegistry, csvExport (BOM+UTF-8 엑셀 호환)
- types: areaSearch.types (상수, 색상, 모드)

주요 기능:
- 폴리곤/사각형/원 구역 그리기 + 드래그 순서 변경
- 구역별 색상 구분 (빨강/청록/황색)
- 시간 기반 애니메이션 재생 (TripsLayer 궤적 + 가상선박 이동)
- 선종/개별 선박 필터링, 항적 표시/궤적 표시 토글
- 호버 툴팁 (국기 SVG, 구역별 진입/진출 시각·위치)
- CSV 내보내기 (신호원, 식별번호, 국적 ISO 변환, 구역 통과 정보)

기존 파일 수정:
- SideNav/Sidebar: gnb8 '항적분석' 메뉴 활성화
- useShipLayer: areaSearch 레이어 병합
- MapContainer: useAreaSearchLayer 훅 + 호버 핸들러 + 타임라인 렌더링
- trackLayer: layerIds 파라미터 추가 (area search/track query 레이어 ID 분리)
- ShipLegend: 항적분석 모드 선종 카운트 지원
- countryCodeUtils: MMSI MID→ISO alpha-2 매핑 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 12:29:31 +09:00
LHT
e45be93e71 chore: publish 폴더 복원 및 그레이스풀 폴백 적용
- git 이력에서 publish 파일 45개 복원 (layouts, pages, components, scss)
- Sidebar.jsx: import.meta.glob 패턴으로 publish 폴더 없이도 빌드 가능
- App.jsx: lazy import에 catch 추가로 publish 누락 시 안내 메시지 표시
- .gitignore: src/publish/ 제외 해제 (git 추적 포함)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 14:29:01 +09:00
LHT
7522318ff9 chore: 폐쇄망 배포 환경 구성 및 불필요 파일 정리
- Yarn Offline Mirror 설정 (.yarnrc, .yarn-offline-cache/)
- Windows 폐쇄망 초기 세팅 스크립트 (setup-windows.bat)
- README.md 폐쇄망 세팅 가이드 추가
- .DS_Store 8개 git 추적 제거
- 손상된 파일명(셸 명령어 파일명) 4개 git 추적 제거
- .gitignore 정리 (**/.DS_Store, !README.md, package-lock.json 제외)
- SCSS 스타일 수정 반영
- signalWorker.js 수정 반영

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 14:14:27 +09:00
346e5cdcc7 feat: 리플레이 궤적 표시 TripsLayer 전환 및 이상치 자동 분류
- ScatterplotLayer 기반 수동 프레임 기록 → TripsLayer(deck.gl/geo-layers) GPU 기반 렌더링 전환
- 궤적 길이: 1시간 (시간 기반, 배속 무관 동일 시각적 길이)
- 32비트 float 정밀도 문제 해결: startTime 기준 상대 타임스탬프 사용

이상치 선박 자동 '삭제' 그룹 분류:
- 조건1: 인접 포인트 간 거리 > 100km가 (조회일수 × 5)건 이상
- 조건2: 선박별 평균 속도 > 50노트
- queryCompleted 시 1회만 계산, 렌더링 성능 영향 없음
- 사용자가 이후 그룹 변경 가능

기본값 변경:
- 궤적 표시: true (기본 활성화)
- 재생 배속: 500배속
- 로딩 완료 시 자동 재생 시작

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 10:14:08 +09:00
19b2cff39e feat: 리플레이 범례/궤적 최적화/로딩 프로그레스/UI 개선
- 리플레이 전용 범례(ReplayLegend): 재생 시점 선종별 카운트, 필터 동기화
- 궤적 표시 성능 최적화: 거리 필터(100m), 역비례 프레임 계산, 배속별 동일 시각적 길이
- 궤적 필터 동기화: 선종 OFF 즉시 제거, 프로그레스 드래그 시 클리어, 배속 변경 시 리셋
- 리플레이 로딩 프로그레스: 화면 중앙 원형 오버레이, 머지 타임스탬프 기반 진행률
- 선박 메뉴에서 필터 패널 직접 열기, 좌측 하단 필터/레이어 버튼 비활성화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 09:59:30 +09:00
1e317c1cbe chore: gitignore 업데이트 및 추적 제외 파일 정리
- .env* 환경변수 파일 제외
- 빌드 산출물(*.zip), 서버 설정(httpd.conf) 제외
- tracking VesselListManager 참조용 디렉토리 제외
- .DS_Store, .md 파일 추적 해제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:47:50 +09:00
cd3b534dd8 fix: 이미지 경로 BASE_URL 적용 (배포 환경 호환)
- 하드코딩된 /images/ 경로를 import.meta.env.BASE_URL 기반으로 변경
- 배포 환경(/kcgv/) 서브패스 호환성 확보

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:38:01 +09:00
fa34c6cd0c perf: Web Worker 데이터 파싱 및 배치 처리 최적화
- signalWorker.js 추가 (메인 스레드 파싱 오프로딩)
- useShipData 500ms 배치 인터벌 + Worker 연동
- stompClient에 subscribeShipsRaw 추가 (Worker용)
- signalApi에 fetchAllSignalsRaw 추가 (Worker용)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:37:53 +09:00
f273080d5e feat: MapContainer 통합 (항적조회, 리플레이, 추적 모드)
- TopBar, 항적조회 뷰어, 리플레이 타임라인 통합
- 배경지도 전환 레이어 가시성 토글
- 추적 모드 훅 연동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:37:46 +09:00
83f5f72b0e feat: 추적 모드 반경 필터링 구현
- useTrackingMode 훅 (함정 중심 지도 이동 + 반경 원)
- useRadiusFilter 훅 (Bounding Box + Haversine 거리 계산)
- shipStore 반경 필터 연동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:37:38 +09:00
b209c9498c feat: 리플레이 모드 구현
- replay 패키지 (stores, components, hooks, services, utils, types)
- WebSocket 기반 청크 데이터 수신 (ReplayWebSocketService)
- 시간 기반 애니메이션 (재생/일시정지/정지, 배속 1x~1000x)
- 항적 표시 토글 (playbackTrailStore - 프레임 기반 페이딩)
- 선박 상태 관리 + 필터링 (선종, 신호원)
- 드래그 가능한 타임라인 컨트롤러
- 라이브/리플레이 전환 (liveControl)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:37:20 +09:00
e74688a969 feat: 항적조회 기능 구현
- tracking 패키지 TS→JS 변환 (stores, services, components, hooks, utils)
- 모달 항적조회 + 우클릭 항적조회
- 라이브 연결선 (PathStyleExtension dash + 1초 인터벌)
- TrackQueryModal, TrackQueryViewer, GlobalTrackQueryViewer
- 항적 레이어 (trackLayer.js)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:36:57 +09:00
61dc5a0e4d feat: 레이아웃 UI 및 사이드바 개선
- Header, Sidebar, SideNav, ToolBar 컴포넌트 업데이트
- 사이드바 스타일 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:36:27 +09:00
c068f55077 feat: 배경지도 전환 및 테마 시스템 구현
- 배경지도 타입 전환 (일반/전자해도/야간)
- 테마 연동 색상 시스템 (선박 라벨, 속도벡터 등)
- mapStore에 subscribeWithSelector 적용
- 신호원 우선순위/항적 조회기간 상수 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:36:09 +09:00
a5131306c4 feat: 앱 구조 개선 및 공통 컴포넌트
- publish 영역 lazy loading 적용 (빌드 시 tree-shaking)
- Toast 공통 컴포넌트 추가
- assetPath 유틸 추가 (BASE_URL 기반 경로 해석)
- csvDownload 유틸 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:35:50 +09:00
c123f234f2 chore: Vite 빌드 설정 및 프로젝트 구조 개선
- esbuild drop 옵션으로 빌드 시 console/debugger 자동 제거
- 개발용 폴더(publish, component/wrap) 빌드 시 제외
- 프록시 설정 추가 (signal-api, ship/image, tracks)
- index.html root 이동 (public/ → root)
- 의존성 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:35:31 +09:00
8292251758 feat: TopBar 컴포넌트 및 추적 모드 기능 구현
[TopBar 구현]
- 좌표 표시 (마우스 위치 실시간 표시, 도분초/도 토글)
- 시간 표시 (UTC/KST 토글)
- 선박 검색 기능 (like 검색, 디바운싱)
- 지도/선박 모드 토글 버튼

[추적 모드 기능]
- PatrolShipSelector: 경비함정 선택 패널
  - 검색 기능 (함정명/ID like 검색)
  - 반경 설정 (10/25/50/100/200 NM)
  - 스크롤 가능한 함정 목록
- ShipContextMenu: 반경설정 서브메뉴 추가
  - 단일 경비함정 우클릭 시 반경 선택 가능
  - 화면 위치에 따른 서브메뉴 방향 자동 조정

[반경 필터링]
- 선박 렌더링: 반경 내 선박만 표시
- 범례 카운트 계산: 반경 내 선박 수 표시
- 검색 결과: 추적 모드 시 반경 내 선박만 검색
- Haversine 거리 계산 + Bounding Box 사전 필터링

[추적 선박 표시]
- ScatterplotLayer 3중 구조 (외곽링, 내부원, 중심점)
- 추적 중인 경비함정 위치에 시각적 마커 표시
2026-02-04 08:16:29 +09:00
519f3b3fe2 chore: publish 폴더 gitignore 추가
- 퍼블리시 원본 참조용 폴더 git 추적 제외
- 실제 구현은 src/components, src/pages에서 진행
- 빌드 및 커밋에서 제외

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:46:21 +09:00
d2580d9487 chore: TypeScript 파일 gitignore 추가
- 메인 프로젝트 참조용 TS/TSX 파일 git 추적 제외
- 항적조회, 항적분석, 리플레이 기능 참조용으로만 사용
- 빌드 및 커밋에서 제외

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:45:52 +09:00
8a159ce809 fix: 단독선박+레이더 통합 표시 및 모달 생성 로직 개선
- integrate 플래그를 활용한 통합선박 판별 로직 추가
  - shipStore.js: buildDynamicPrioritySet에 integrate 조건 추가
  - ShipBatchRenderer.js: 카운트 로직에 integrate 조건 추가
  - shipLayer.js: isIntegratedShip 함수 개선

- 선박 모달 생성 로직 개선
  - openDetailModal에서 레이더 대표 선박 자동 교체
  - 통합선박의 비레이더 신호원 우선순위 기반 선택

- 모달 신호상태 아이콘 표시 통일
  - ShipDetailModal.jsx: SignalFlags에 integrate 조건 추가
  - 선박 아이콘과 모달의 신호상태 표시 로직 통일

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 08:41:28 +09:00
ae48bca97a refactor: 카운트/필터 로직을 메인 프로젝트 렌더 사이클 구조로 전환
문제:
- 다크시그널 선박이 통합모드에서 렌더링 안 됨
  (통합모드 체크가 다크시그널 체크보다 먼저 실행)
- 카운트가 계속 증가 (cleanup과 카운트 계산의 동기화 불일치)

변경:
- applyFilterWithCache: 다크시그널 체크를 통합모드 체크보다 앞으로 이동
- shipStore: mutable Map/Set → immutable 패턴 전환 (featuresVersion/darkSignalVersion 제거)
- ShipBatchRenderer: calculateAndCleanupLiveShips 추가 (단일 패스 cleanup + 카운트)
- executeRender 내부에서 5초 쓰로틀 카운트 + filterHash 변경 즉시 재계산
- shipStore에서 updateCountsThrottled, recalculateCounts, calculateCounts 제거
- 모든 필터 토글에서 recalculateCounts() 호출 제거
- useShipLayer: features/darkSignalIds 참조 감시로 전환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 12:40:20 +09:00
f2b2de6f68 fix: 레이더(000005) 카운트 제외 - 통합 여부 무관하게 항상 스킵
메인프로젝트(deck.ts:274-278)와 동일하게 signalSourceCode가
RADAR이면 통합/단독 무관하게 카운트에서 항상 제외.

기존: 단독 레이더(!integrate)만 제외 → 통합 레이더가 카운트에 포함되어
VTS_RADAR 필터 ON 시 과다집계 발생
수정: 모든 레이더를 카운트 + 타임아웃 체크에서 통합 조건 제거

원인: 통합그룹의 다른 장비(AIS 등)가 삭제/다크시그널 상태일 때
레이더만 features에 남아 있으면 해당 targetId가 추가 카운트됨

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:32:30 +09:00
5eac7678bf fix: mergeFeatures에 타임스탬프 비교 추가 (이전 시간대 데이터 무시)
메인프로젝트(deckStore.ts:163)와 동일하게 기존 저장된 데이터의
receivedTimestamp보다 이전 시간대의 메시지는 무시하도록 수정.

이전: 모든 메시지를 무조건 덮어씀 → 오래된 메시지가 최신 데이터를
덮어쓰거나 삭제/다크시그널 처리된 선박을 부활시킴
이후: newTimestamp < currentFeature.receivedTimestamp이면 스킵

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:48:29 +09:00
c4e40a0cef fix: 카운트 5초 쓰로틀 복원 및 targetId 중복 제거 수정
문제:
- incremental count가 매 메시지마다 스토어 갱신하여 범례 실시간 변동
- targetId 중복 제거 없이 개별 장비별로 카운트되어 수치 과다

수정:
- incremental count 제거, 5초 주기 fullRecount 방식으로 복원
- updateCountsThrottled: 타임아웃 체크 + calculateCounts 통합 (5초 주기)
- calculateCounts: targetId 중복 제거 포함 정확한 카운트 계산
- mergeFeatures에서는 features/darkSignalIds만 갱신, 카운트는 5초마다
- 필터 변경/삭제 시에는 recalculateCounts로 즉시 재계산

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:39:19 +09:00
08518c7c33 fix: initialKindCounts 선언 순서 수정 (TDZ 에러)
countRegistry가 initialKindCounts보다 먼저 선언되어 발생한
ReferenceError 수정. initialKindCounts를 countRegistry 위로 이동.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:27:03 +09:00