커밋 그래프

10 커밋

작성자 SHA1 메시지 날짜
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
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
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
dd694bdcbb feat: React 19 SPA Dashboard Phase 1 + 안전 배포 시스템
## React SPA Dashboard
- React 19 + Vite 7 + Tailwind CSS 4 + Recharts 2 SPA 구축
- Dashboard (배치현황/시스템메트릭/캐시/처리량) + JobMonitor (이력조회/Step상세)
- i18n 다국어(ko/en) 시스템, Light/Dark 테마 CSS 토큰 전환
- frontend-maven-plugin 1.15.1 (mvn package 시 자동 빌드)
- WebViewController SPA forward + context-path /signal-batch
- 레거시 HTML 48개 파일 전체 삭제

## 안전 배포
- VesselBatchScheduler @PreDestroy: 신규 Job 차단 + 실행 중 Job 완료 대기
- server.shutdown=graceful, timeout-per-shutdown-phase=3m
- deploy.yml: 활성 Job 3초 연속 확인 후 stop → 교체 → start
- signal-batch.service TimeoutStopSec 60→180
- scripts/deploy.sh: 수동 배포용 안전 스크립트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:05:38 +09:00
cf48cc94c7 feat: 다계층 인메모리 캐시(L1/L2/L3) 조회 통합 + CACHE-MONITOR 로그
L1(5min) + L2(hourly, 신규) + L3(daily) 3계층 캐시로 오늘 범위 조회를
DB 쿼리 대신 인메모리 캐시에서 처리하도록 전환.

신규:
- HourlyTrackCache: Caffeine L2 캐시 (TTL 26h, 780K entries)
- CacheWarmupService: L1/L2/L3 통합 비동기 워밍업
- VesselTrackToCompactConverter: VesselTrack → CompactVesselTrack 변환

변경:
- GisServiceV2: todayRange → hourlyRange(L2) + fiveMinRange(L1) 캐시 우선 조회
- DailyTrackCacheManager: SplitQueryResult에 hourlyRange/fiveMinRange 분리
- CompositeTrackWriter: hourly 저장 시 L2 캐시 동시 적재
- HourlyAggregationJobConfig: hourly 완료 → L1 cleanup 리스너
- DailyAggregationJobConfig: daily 완료 → L2 cleanup 리스너
- AsyncConfig: cacheWarmupExecutor 전용 스레드 풀 추가
- [CACHE-MONITOR] 임시 모니터링 로그 9개 파일 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 13:29:06 +09:00
2e9361ee58 refactor: SNP API 전환 및 레거시 코드 전면 정리
- CollectDB 다중 신호 수집 → S&P Global AIS API 단일 수집으로 전환
- sig_src_cd + target_id 이중 식별자 → mmsi(VARCHAR) 단일 식별자
- t_vessel_latest_position → t_ais_position 테이블 전환
- 레거시 배치/유틸 ~30개 클래스 삭제 (VesselAggregationJobConfig, ShipKindCodeConverter 등)
- AisTargetCacheManager 기반 캐시 이중 구조 (최신위치 + 트랙 버퍼)
- CacheBasedVesselTrackDataReader + CacheBasedTrackJobListener 신규 추가
- VesselStaticStepConfig: 정적정보 CDC 변경 검출 + hourly job 편승
- SignalKindCode enum: vesselType/extraInfo 기반 선종 자동 분류
- WebSocket/STOMP 전체 mmsi 전환 (StompTrackStreamingService ~40곳)
- 모니터링/성능 최적화 코드 mmsi 기반 전환
- DataSource 설정 통합 (snpdb 단일 DB)
- AreaBoundaryCache Polygon→Geometry 캐스트 수정 (MULTIPOLYGON 지원)
- ConcurrentHashMap 적용 (VesselTrackStepConfig 동시성 버그 수정)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 09:59:49 +09:00
e729316edf feat: IntegrationVessel 전용 DataSource 지원 및 프로파일 호환성 보장
- IntegrationVesselService에 전용 DataSource 자체 생성/관리 추가
  - vessel.integration.datasource.* 설정으로 별도 DB 연결 가능
  - @PostConstruct에서 경량 HikariDataSource 생성 (max 3, min 1)
  - 미설정 시 queryDataSource 자동 폴백 (기존 동작 유지)
- prod: 별도 DB (mdadb2 gis.t_ship_integration_sub) → 전용 DataSource
- dev/prod-mpr: queryDB signal 스키마 → queryDataSource 폴백
- 기존 DataSourceConfig 4개 파일 수정 없이 프로파일 완벽 호환

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 07:23:44 +09:00
cc165fc36a feat: 항적 조회 안정성 개선 - 계층적 폴백, 선박 누락 방지, 2-pass 뷰포트 필터링
- GisService: 하위 구간 미집계 감지 시 상위 테이블에서 보완 집계하는
  계층적 폴백 로직 추가 (daily→hourly→5min)
- ChunkedTrackStreamingService: 빈 LineString으로 인한 선박 객체 누락 방지,
  MAX_TRACKS_PER_CHUNK를 500,000으로 증가
- ChunkedTrackStreamingService: 2-pass 뷰포트 필터링 구현
  Pass 1에서 뷰포트 교차 선박 ID를 수집하고, Pass 2에서 해당 선박의
  전체 항적을 viewport 필터 없이 조회하여 선박 소실 현상 해결
- TrackConverter: 빈 geometry에서도 선박 객체 반환하도록 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 06:53:47 +09:00
89482d854f feat: Add V2 REST API with WebSocket-compatible responses
- Add GisControllerV2/GisServiceV2 for CompactVesselTrack responses
- Add nationalCode and shipKindCode fields to REST API responses
- Add flexible DateTime parsing support (multiple formats)
- Add TrackConverter utility for track data conversion
- Update SwaggerConfig with V2 API endpoints and unified tags
- Update ProdDataSourceConfig for prod-mpr profile support
- Enhance Swagger documentation for all DTOs
2026-01-20 13:38:31 +09:00
2a708b3318 Initial commit 2025-11-19 16:03:16 +09:00