release: SNP API 전환 + 인메모리 캐시 최적화 + 다계층 캐시 조회 통합 #7

병합
htlee develop 에서 main 로 14 commits 를 머지했습니다 2026-02-19 14:26:31 +09:00
소유자

Summary

develop 브랜치의 전체 변경사항을 main에 통합합니다.

포함된 MR

  • MR #3: 팀 워크플로우 초기 구성 + SNP API 전환 및 레거시 정리
  • MR #4: Hourly Job 인메모리 병합 전환 — N+1 SQL(60K+) 제거
  • MR #5: Stale 데이터 비정상 궤적 전환 + vesselStatic N+1 쿼리 제거
  • MR #6: 다계층 인메모리 캐시(L1/L2/L3) 조회 통합 + CACHE-MONITOR 로그

주요 변경

  • sig_src_cd + target_idmmsi 단일 식별자 전환 (전체 코드베이스)
  • CollectDB 다중 신호 → S&P Global AIS API 단일 수집 전환
  • Hourly Job: N+1 SQL → FiveMinTrackCache 인메모리 병합 (DB 쿼리 0~2회)
  • 3계층 캐시(L1 5min + L2 hourly + L3 daily)로 오늘 범위 조회 인메모리 처리
  • 레거시 ~25개 클래스 삭제
  • [CACHE-MONITOR] 임시 모니터링 로그 추가

메모리 예산

캐시 엔트리 수 합계
L1 (5min) 450K ~300MB
L2 (hourly) 780K ~2.0GB
L3 (daily) 210K ~3.8GB

🤖 Generated with Claude Code

## Summary develop 브랜치의 전체 변경사항을 main에 통합합니다. ### 포함된 MR - **MR #3**: 팀 워크플로우 초기 구성 + SNP API 전환 및 레거시 정리 - **MR #4**: Hourly Job 인메모리 병합 전환 — N+1 SQL(60K+) 제거 - **MR #5**: Stale 데이터 비정상 궤적 전환 + vesselStatic N+1 쿼리 제거 - **MR #6**: 다계층 인메모리 캐시(L1/L2/L3) 조회 통합 + CACHE-MONITOR 로그 ### 주요 변경 - `sig_src_cd + target_id` → `mmsi` 단일 식별자 전환 (전체 코드베이스) - CollectDB 다중 신호 → S&P Global AIS API 단일 수집 전환 - Hourly Job: N+1 SQL → FiveMinTrackCache 인메모리 병합 (DB 쿼리 0~2회) - 3계층 캐시(L1 5min + L2 hourly + L3 daily)로 오늘 범위 조회 인메모리 처리 - 레거시 ~25개 클래스 삭제 - [CACHE-MONITOR] 임시 모니터링 로그 추가 ### 메모리 예산 | 캐시 | 엔트리 수 | 합계 | |------|----------|------| | L1 (5min) | 450K | ~300MB | | L2 (hourly) | 780K | ~2.0GB | | L3 (daily) | 210K | ~3.8GB | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
htlee added 14 commits 2026-02-19 13:43:05 +09:00
- .claude/rules: team-policy, git-workflow, code-style, naming, testing
- .claude/skills: init-project, sync-team-workflow, create-mr, fix-issue
- .claude/scripts: on-pre-compact, on-post-compact, on-commit (v1.2.0)
- .claude/settings.json: 팀 표준 권한 allow/deny + script hooks
- .githooks: commit-msg, pre-commit (mvn compile), post-checkout
- .mvn/settings.xml: Nexus 미러 설정
- .editorconfig: 팀 표준 포맷
- CLAUDE.md: 팀 규칙 참조 섹션 추가
- .gitignore: !.claude/ negation 추가 (글로벌 gitignore override)

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

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

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