feat: Stale 데이터 비정상 궤적 전환 + vesselStatic N+1 쿼리 제거 #5

병합
htlee feature/stale-data-abnormal-track 에서 develop 로 3 commits 를 머지했습니다 2026-02-19 13:34:12 +09:00
소유자

Summary

  • Stale 데이터(과거 timestamp) 비정상 궤적 전환 — 정보 보존
  • hourly job timeBucket 파라미터 문자열 "hourly" → 실제 시간값 전달 수정
  • vesselStaticSyncStep N+1 쿼리 제거 — DISTINCT ON bulk SELECT로 전환

Commits

  • 732f69e feat: Stale 데이터 비정상 궤적 전환
  • a6d886c fix: hourly job timeBucket 파라미터 수정
  • 4dd40b7 perf: vesselStaticSyncStep N+1 쿼리 제거

Depends on

  • MR #4 (feature/hourly-inmemory-merge → develop) 선행 머지 필요

🤖 Generated with Claude Code

## Summary - Stale 데이터(과거 timestamp) 비정상 궤적 전환 — 정보 보존 - hourly job timeBucket 파라미터 문자열 "hourly" → 실제 시간값 전달 수정 - vesselStaticSyncStep N+1 쿼리 제거 — DISTINCT ON bulk SELECT로 전환 ## Commits - `732f69e` feat: Stale 데이터 비정상 궤적 전환 - `a6d886c` fix: hourly job timeBucket 파라미터 수정 - `4dd40b7` perf: vesselStaticSyncStep N+1 쿼리 제거 ## Depends on - MR #4 (feature/hourly-inmemory-merge → develop) 선행 머지 필요 🤖 Generated with [Claude Code](https://claude.com/claude-code)
htlee added 5 commits 2026-02-19 13:31:58 +09:00
- 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>
Hourly 집계의 N+1 DB 쿼리 패턴(60K+)을 인메모리 병합으로 교체.
5분 트랙 적재 시 FiveMinTrackCache에 보관하고 hourly job에서 캐시 기반으로
좌표 병합/통계 집계/간소화를 수행하여 DB 쿼리를 0~2회로 감소.

- FiveMinTrackCache: Caffeine 캐시 (TTL 75분, maxSize 500K)
- CacheBasedHourlyTrackReader: 캐시 기반 Reader + DB fallback
- HourlyTrackMergeProcessor: Java WKT 병합 + 비정상 검출 bulk prefetch
- @ConfigurationProperties 중복 해결 (프로그래밍 방식 Hikari 바인딩)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- CacheBasedVesselTrackDataReader: stale 그룹 스킵 제거 → 전체 통과 + 감지 로깅
- VesselTrackStepConfig: Processor에서 stale time_bucket 감지 시 비정상 궤적으로 전환
  - abnormal_type: stale_timestamp (신규 분류)
  - time_bucket: 현재 5분 버킷으로 오버라이드 (파티션 존재 보장)
  - details: 원본 time_bucket, 지연 시간(분/시), 속도/거리 정보

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
VesselBatchScheduler에서 hourlyAggregationJob 실행 시 timeBucket 파라미터에
"hourly" 문자열을 전달하여 HourlyTrackMergeProcessor의 LocalDateTime.parse() 실패.
startTime (정시 값)을 전달하도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
이전: MMSI별 개별 SELECT (~10만 쿼리) → 수 분 소요
이후: DISTINCT ON (mmsi) 1회 bulk SELECT → 인메모리 CDC 비교

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
htlee merged commit bfc4614ce7 into develop 2026-02-19 13:34:12 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 1명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

Reference: gc/signal-batch#5
No description provided.