커밋 그래프

8 커밋

작성자 SHA1 메시지 날짜
121a7b7d01 fix: 배치 Job 0건 처리 버그 수정 (메모리 최적화가 배치 데이터 삭제)
PerformanceOptimizationManager.performMemoryOptimization()에서
vesselDataHolder.clear()를 제거하여 배치 실행 중 로드된 데이터 보호.
DailyTrackCache 4.3GB 상주로 메모리 83% → 70% 임계값에서 매번 트리거되어
방금 로드한 24K건 배치 데이터가 GC로 소실되던 문제 해결.

변경사항:
- performMemoryOptimization(): vesselDataHolder/vesselTrackDataHolder.clear() 제거
- beforeJob 메모리 임계값: 70% → 90%
- afterChunk 긴급 최적화 임계값: 85% → 95%
- 캐시 메모리 한도: 5GB → 6GB (일 평균 ~720MB × 7일 = ~5GB)
- .gitignore에 *.log 추가, 로그 파일 트래킹 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 09:37:16 +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
7bd7bf556e feat: 대기열 기반 쿼리 관리 및 타임아웃 최적화 (Phase 5)
- 거부 대신 대기열 순번 안내: QUEUED 상태 2초 간격 전송 (최대 2분)
- QueryStatusUpdate에 queuePosition, totalInQueue 필드 추가
- ActiveQueryManager: ConcurrentLinkedQueue 기반 대기열 추적
- WebSocketProperties에 SessionProperties 추가 (타임아웃/하트비트 설정)
- WebSocketStompConfig: 하드코딩 → Properties 주입으로 전환
- application-prod.yml: Query풀 180, global 60, idle 15s, heartbeat 5s
- AsyncConfig: core 40, max 120, queue 100 (대기열 수용)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:34:02 +09:00
122a247faf perf: DB 커넥션 풀 재분배 (총 250개, prod 환경)
Phase 1.4: DB 서버 500개 중 250개를 보수적으로 할당
- Query: 60 → 120 (min 20) — WebSocket 스트리밍 + REST API 주 사용 (48%)
- Collect: 20 → 80 (min 15) — 배치 Reader, 신호 수집 조회 (32%)
- Batch: 20 → 30 (min 5) — Spring Batch 메타데이터 (12%)
- 예비: 20개 (8%) — 운영 여유분

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:38:15 +09:00
78ff307785 feat: 글로벌 동시 쿼리 제한(Semaphore) 및 쿼리 완료 시 리소스 반환 보장
Phase 1.1 + 1.2: WebSocket 리플레이 요청 동시 부하 제어
- ActiveQueryManager에 Fair Semaphore 기반 글로벌 동시 쿼리 제한 추가 (기본 30개)
- @Async 스트리밍 메서드 내에서 슬롯 획득 (인바운드 채널 블로킹 방지)
- 쿼리 완료/실패/취소 시 finally 블록에서 반드시 리소스 반환
  - 글로벌 Semaphore 슬롯 반환
  - 세션별 쿼리 카운트 감소 (기존 누락 수정)
  - ActiveQueryManager 쿼리 정리
- TrackQueryInterceptor 세션 제한값 외부 설정화 (@Value)
- application-prod.yml에 websocket.query 설정 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:36:10 +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