커밋 그래프

104 커밋

작성자 SHA1 메시지 날짜
e28d49958a Merge pull request 'chore: L2 HourlyTrackCache maxSize 3.5M→5M 상향' (#73) from feature/dashboard-phase-1 into develop 2026-02-21 00:28:03 +09:00
6db0a5a3fa chore: L2 HourlyTrackCache maxSize 3.5M→5M 상향
실측 24시간 기준 3.5M 100% 도달 확인 — 메모리 여유 있으므로
5M으로 상향 후 며칠 추이 관찰하여 상한선 확정 예정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:26:34 +09:00
b7f473b0da Merge pull request 'fix: html2canvas oklch/oklab 색상 파싱 에러 수정' (#71) from feature/dashboard-phase-1 into develop 2026-02-20 20:50:17 +09:00
d3e43654e9 fix: html2canvas oklch/oklab 색상 파싱 에러 수정
Tailwind CSS 4의 oklch()/color-mix(in oklab) 함수를 html2canvas가
파싱하지 못하는 문제 해결 — 캡처 전 모든 요소의 색상을 브라우저
computed RGB 값으로 강제 인라인 적용 후 캡처, 완료 후 원복

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 20:49:22 +09:00
fa2610c9a1 Merge pull request 'feat: UI 레이아웃 수정 + 구역분석/STS 보고서 모달 + 이미지 저장' (#69) from feature/dashboard-phase-1 into develop 2026-02-20 18:46:30 +09:00
b20510599c feat: UI 레이아웃 수정 + 구역분석/STS 보고서 모달 + 이미지 저장
- 날짜 입력 세로 배치 (좁은 사이드바 대응)
- 결과 리스트 높이 max-h-[40vh] 반응형 개선
- TimelineControl 반응형 폭 + z-index 수정
- VesselDetailModal: 임베디드 지도 + 방문이력 + 이미지 저장
- StsContactDetailModal: 2항적 지도 + 접촉통계 + 이미지 저장
- html2canvas 의존성 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 18:44:38 +09:00
efe6073cc7 Merge pull request 'feat: 다중구역이동 항적 분석 + STS 접촉 분석 프론트엔드 이관' (#67) from feature/dashboard-phase-1 into develop 2026-02-20 17:07:45 +09:00
1cc25f9f3b feat: 다중구역이동 항적 분석 + STS 접촉 분석 프론트엔드 이관
- terra-draw 기반 지도 폴리곤/사각형/원 그리기 + 편집 (OL Draw 대체)
- 구역 항적 분석: ANY/ALL/SEQUENTIAL 검색모드, 다중구역 시각화
- STS 선박쌍 접촉 분석: 접촉쌍 그룹핑, 위험도 indicator, ScatterplotLayer
- Deck.gl 레이어: PathLayer + TripsLayer + IconLayer (커서 기반 O(1) 보간)
- 공유 타임라인 컨트롤 (재생/배속/프로그레스바)
- CSV 내보내기 (다중 방문 동적 컬럼, BOM+UTF-8)
- ApiExplorer 5모드 통합 (positions/vessel/replay/area-search/sts)

신규 17파일 (features/area-search/), 수정 5파일

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 17:07:14 +09:00
b5bb22ea14 Merge pull request 'feat: 항적/리플레이 선종 아이콘 + Raw Data 패널' (#65) from feature/dashboard-phase-1 into develop 2026-02-20 15:59:56 +09:00
f41463d0f2 feat: 항적/리플레이 선종 아이콘 표시 수정 + Raw Data 패널 추가
- 속도 0일 때 이동 아이콘으로 표시하여 선종별 색상/형태 구분
- ApiExplorer 좌측 패널에 Swagger 스타일 JSON 응답 데이터 표시
- 3모드(최근위치/항적/리플레이) 각각 선택 데이터 실시간 표시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 15:59:33 +09:00
33acf86277 Merge pull request 'fix: 항적 조회 500 에러 + 리플레이 쿼리 무반응 수정' (#63) from feature/dashboard-phase-1 into develop 2026-02-20 15:37:05 +09:00
4e6e6392c6 fix: 항적 조회 500 에러 + 리플레이 쿼리 무반응 수정
- gisApi: mmsiList → vessels 필드명 백엔드 DTO 일치
- ReplaySetupPanel: datetime 포맷 ISO 'T' 유지 (백엔드 @JsonFormat 호환)
- replayWebSocket: STOMP 에러/응답 로깅 강화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 15:36:42 +09:00
e0dc0b855a Merge pull request 'feat: Ship-GIS 기능 이관 — 최근위치/선박항적/뷰포트 리플레이' (#61) from feature/dashboard-phase-1 into develop 2026-02-20 15:21:41 +09:00
ed0f3056b1 feat: Ship-GIS 기능 이관 — 최근위치/선박항적/뷰포트 리플레이
dark(ship-gis) 프로젝트의 맵 기반 3대 기능을 API 탐색기에 이관.
Feature 폴더 모듈화 구조로 타 프로젝트 재활용 가능하게 구성.

Phase 1: vessel-map 공유 모듈 (Deck.gl 9 + Zustand 5 + STOMP)
Phase 2: 최근 위치 (30초 폴링 + IconLayer + 선종 필터 + 팝업)
Phase 3: 선박 항적 (MMSI 조회 + PathLayer + 타임라인 보간)
Phase 4: 뷰포트 리플레이 (STOMP WebSocket 청크 + TripsLayer 애니메이션)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 15:19:21 +09:00
fc7beac9f7 Merge pull request 'fix: shipimg path conflict' (#59) from feature/dashboard-phase-1 into develop 2026-02-20 11:39:32 +09:00
273d65c01a perf: Daily Job 인메모리 캐시 기반 최적화 — N+1 SQL 제거
Hourly Job에 적용된 캐시 기반 병합 패턴을 Daily Job에 동일 적용:
- CacheBasedDailyTrackReader: L2(HourlyTrackCache)에서 읽기 + DB fallback
- DailyTrackMergeProcessor: Java 인메모리 WKT 병합 + 통계 집계
- 비정상 검출: MMSI별 개별 쿼리 → 1회 bulk prefetch
- SQL ~20,000건 → ~3건 (99.98% 감소), 24분 → 30~60초 예상

삭제: DailyTrackProcessor, DailyTrackProcessorWithAbnormalDetection,
      BaseTrackProcessorWithAbnormalDetection (N+1 SQL 프로세서)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 11:38:48 +09:00
60f24a61a5 Merge pull request 'fix: shipimg 경로 충돌 수정' (#58) from feature/dashboard-phase-1 into develop 2026-02-20 02:17:35 +09:00
8a9efdaf95 fix: shipimg 경로 충돌 수정 — /{imo} 숫자 패턴 제약 추가
- /{imo} → /{imo:\d+}로 변경하여 /valid-list 경로와 충돌 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 02:17:18 +09:00
a2ae39a232 Merge pull request 'feat: recent-positions 선박사진 enrichment' (#56) from feature/dashboard-phase-1 into develop 2026-02-20 02:12:07 +09:00
d49fd6a790 feat: recent-positions 응답에 선박사진 정보 enrichment 추가
- ShipImageService @PostConstruct로 85K IMO 인메모리 캐시 로드
- RecentVesselPositionDto에 shipImagePath, shipImageCount 필드 추가
- VesselPositionService에서 imo 기반 O(1) lookup으로 사진 정보 주입
- ShipImageRepository에 이미지 수 포함 쿼리 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 02:11:45 +09:00
c2a0c43fd6 Merge pull request 'feat: recent-positions IMO 필드 + 선박사진 보유 목록 API' (#54) from feature/dashboard-phase-1 into develop 2026-02-20 02:05:52 +09:00
27891baada feat: recent-positions IMO 필드 추가 + 선박사진 보유 목록 API
- RecentVesselPositionDto에 imo 필드 추가 (0이면 null 처리)
- GET /api/v2/shipimg/valid-list: 선박사진 보유 IMO 전체 목록 + 썸네일 경로
- 초기 로딩 시 선박 썸네일 즉시 표시 용도 (85K+ IMO)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 02:05:20 +09:00
f5738978ed Merge pull request 'fix: UTC 타임존 변환 + Daily 캐시 부분 fallback 추가' (#52) from feature/dashboard-phase-1 into develop 2026-02-20 00:47:10 +09:00
68c22b3211 fix: UTC 타임존 변환 + Daily 캐시 부분 fallback 추가
- DateTimeParseUtil: zdt.toLocalDateTime() → withZoneSameInstant(systemDefault) 변환
  클라이언트 UTC 시각("Z" 접미사)이 KST로 변환되지 않아 9시간 밀리는 버그 수정
- GisServiceV2 queryWithCache: Daily 캐시 HIT 후 요청 MMSI 미존재 시
  DB fallback(hourly/5min 계층 조회) 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 00:46:29 +09:00
c8369e193f Merge pull request 'feat: 중국허가선박 최신 위치 조회 API' (#50) from feature/dashboard-phase-1 into develop 2026-02-19 23:04:22 +09:00
00bfa97875 feat: 중국허가선박 최신 위치 조회 API 추가
GET /api/v2/vessels/chnprmship/recent-positions?minutes=60
ChnPrmShipCacheManager에서 지정 시간 내 신호 수신된 선박 조회.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 23:03:32 +09:00
b7dc6eacf8 Merge pull request 'fix: V2 캐시 조회 시 누락 MMSI DB fallback 추가' (#48) from feature/dashboard-phase-1 into develop 2026-02-19 22:52:42 +09:00
17c646e87a fix: V2 캐시 조회 시 누락 MMSI DB fallback 추가
L1/L2 캐시에 다른 선박 데이터가 있어 HIT로 판정되지만
요청한 MMSI가 캐시에 없을 때 DB fallback이 누락되는 버그 수정.
filterByMmsi() 후 누락된 MMSI에 대해 부분 DB fallback 실행.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 22:51:55 +09:00
3669b837f1 Merge pull request 'feat: ChnPrmShip 전용 DB 이력 + API enrichment + ShipImage V2' (#46) from feature/dashboard-phase-1 into develop 2026-02-19 22:37:58 +09:00
0cc6e58f9b feat: ChnPrmShip 전용 DB 이력 + API enrichment + ShipImage V2
- t_chnprmship_positions 월별 파티션 테이블 (PartitionManager 관리)
- ChnPrmShipPositionSyncStep: 5분 Job 편승 캐시→DB 이중 적재
- ChnPrmShip 캐시 TTL 2→7일, 워밍업 소스 전용 DB + t_ais_position 이중화
- tracks/vessels API: includeChnPrmShip=true 시 ChnPrmShipInfo enrichment
- ShipImageControllerV2: /api/v2/shipimg/{imo} 추가
- SwaggerConfig: V2 경로 분리 + shipimg V2 그룹 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 22:37:03 +09:00
198afc1fdc Merge pull request 'docs: Swagger UI 현행화 — 서버 URL, @Schema, @Parameter' (#44) from feature/dashboard-phase-1 into develop 2026-02-19 21:30:06 +09:00
508f35a214 docs: Swagger UI 현행화 — 서버 URL, DTO @Schema, @Parameter 추가
- SwaggerConfig: 서버 URL을 현행 환경(192.168.1.18:18090)으로 업데이트
- AbnormalTrackResponse: 13개 필드에 @Schema 어노테이션 추가
- AbnormalTrackStatsResponse: 7개 필드에 @Schema 어노테이션 추가
- GisController V1: minutes 파라미터 4곳에 @Parameter 추가
- BatchAdminController: step/details 엔드포인트에 @Operation 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 21:29:40 +09:00
f34d4921b7 Merge pull request 'fix: 캐시 maxSize 설정 경로 수정' (#42) from feature/dashboard-phase-1 into develop 2026-02-19 20:53:18 +09:00
8a5e77ab80 fix: 캐시 maxSize 설정 경로 수정 — application.yml이 실제 소스
application-prod.yml의 five-min-track/hourly-track가 app.ais-api 아래에
잘못 중첩되어 적용되지 않았음. application.yml의 app.cache 아래가 실제
@Value가 읽는 경로이므로 해당 파일을 수정.

- L1: 700K→1.5M, L2: 1.4M→3.5M (application.yml)
- application-prod.yml: 잘못된 중첩 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:52:55 +09:00
10e99b6cee Merge pull request 'fix: L1/L2 캐시 maxSize 상향 + AisTarget hitRate 타입 수정' (#40) from feature/dashboard-phase-1 into develop 2026-02-19 20:47:45 +09:00
9774a75988 fix: L1/L2 캐시 maxSize 상향 + AisTarget hitRate 타입 수정
- L1(5분): 700K→1.5M (실측 612K, 87% 포화 → 41%)
- L2(시간): 1.4M→3.5M (실측 1.27M, 91% 포화 → 36%)
- AisTarget hitRate: String("64.41%") → double(64.41)
  프론트엔드 .toFixed() 호출 시 타입 에러 수정

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:47:14 +09:00
8e7e8ff2de Merge pull request 'perf: API 응답 최적화 + 점진적 렌더링 + 해구 choropleth 지도' (#38) from feature/dashboard-phase-1 into develop 2026-02-19 20:25:52 +09:00
0cdb46d063 perf: API 응답 최적화 + 점진적 렌더링 + 해구 choropleth 지도
백엔드:
- haegu/realtime: DB 공간 JOIN(12s) → 인메모리 캐시 순회(~50ms)
- batch/statistics: N+1 JobExplorer(1.1s) → 단일 SQL 집계(~100ms)
- batch/daily-stats: N+1×7일(9s) → 직접 SQL 2쿼리(~200ms)
- throughput: pg_total_relation_size 매번 호출(1.4s) → Caffeine 5분 캐시
- quality: 풀스캔(0.6s) → 24시간 범위 제한

프론트엔드:
- Promise.allSettled 차단 → 개별 .then() 점진적 렌더링
- useCachedState 훅: 페이지 전환 시 이전 데이터 즉시 표시
- AreaStats: 해구 폴리곤 choropleth 지도 + 선박수 범례 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 20:24:28 +09:00
97b71b16e1 Merge pull request 'feat: Phase 4 — 비정상 항적 + 시스템 메트릭 (7/7 완성)' (#36) from feature/dashboard-phase-1 into develop 2026-02-19 19:20:21 +09:00
7a17d8e1d8 feat: Phase 4 — 비정상 항적 + 시스템 메트릭 페이지 (7/7 완성)
- AbnormalTracks: 유형별 통계, 일별 추이 차트, 검출 목록 테이블
  - abnormalApi 클라이언트 (recent, summary, types)
- ApiMetrics: 시스템 메트릭, 캐시 상세(L1/L2/L3/AIS), 처리 지연, 히트율
  - 10초 폴링으로 실시간 갱신
- i18n: abnormal.* 17키 + metrics.* 21키 한/영 추가
- 전체 7개 페이지 라우팅 완성 (Navbar 메뉴 전부 활성)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:19:51 +09:00
20cb4b3337 Merge pull request 'feat: Phase 3 — API Explorer 지도 스캐폴딩' (#34) from feature/dashboard-phase-1 into develop 2026-02-19 19:14:30 +09:00
8fafaad6c0 feat: Phase 3 — API Explorer 지도 스캐폴딩
- MapLibre GL JS 5 지도 컨테이너 (Light/Dark 테마 자동 전환)
- Sidebar 접기/펼치기 레이아웃 (320px 사이드바 + 전체 높이 지도)
- API 유형 선택 UI (최근 위치 / 해구별 항적 / 선박별 항적)
- gisApi 클라이언트 (V1/V2 REST API 인터페이스)
- 지도 상수 (한반도 중심, 항적 색상, OpenFreeMap 타일)
- i18n 한/영 explorer.* 키 12개 추가
- lazy loading: ApiExplorer 청크 분리 (gzip 278KB)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:14:03 +09:00
c44075d72b Merge pull request 'perf: L1/L2 캐시 maxSize 상향 (실측 기반)' (#32) from feature/dashboard-phase-1 into develop 2026-02-19 19:09:55 +09:00
4b8b48e494 perf: L1/L2 캐시 maxSize 상향 (실측 기반)
- L1 FiveMinTrackCache: 500K→700K (실측 504K, 30% 여유)
- L2 HourlyTrackCache: 780K→1.4M (실측 1.08M, 30% 여유)
- 기존 산정: 30K MMSI × 버킷 → 실측: 190K MMSI (6.3배 과소 산정)
- L2 메모리 영향: +1.5GB (총 8.6GB, 힙 20~24GB 기준 36~43%)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:09:29 +09:00
9ca3057abd Merge pull request 'fix: 해구 통계 ROUND 함수 타입 캐스팅 오류 수정' (#30) from feature/dashboard-phase-1 into develop 2026-02-19 19:01:17 +09:00
029f912783 fix: 해구 통계 ROUND 함수 타입 캐스팅 오류 수정
GREATEST() 반환값이 double precision이라 ROUND(dp, int) 호출 시
PostgreSQL에서 미지원 함수 에러 발생 → 전체 나눗셈 결과를 ::numeric 캐스팅

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 19:00:50 +09:00
908f047f55 Merge pull request 'fix: 해구 조회 바운딩 박스 간소화' (#28) from feature/dashboard-phase-1 into develop 2026-02-19 18:54:35 +09:00
61ec36c74a fix: 해구 조회 ST_Contains 제거 — 바운딩 박스 조인으로 간소화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 18:54:16 +09:00
c72e3cad36 Merge pull request 'debug: 해구 조회 에러 로깅' (#24) from feature/dashboard-phase-1 into develop 2026-02-19 18:50:13 +09:00
6b1d5f3479 fix: 해구 통계 조회 에러 응답 노출 + 디버그 로깅 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 18:49:27 +09:00