- parseTimestamp 실패 로깅 추가 (AreaSearchService)
- isNightTimeContact 야간 판정 로직 단순화 (VesselContactService)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase A: 버그 수정
- isQueryCancelled: queryCancelFlags 전체 순회 → queryId 직접 조회 (O(n)→O(1))
한 쿼리 취소 시 서버 전체 쿼리 조기 종료되던 치명적 버그 해결
- QueryContext 내부 클래스 추출: 싱글턴 인스턴스 변수 5개를 쿼리별 로컬로 전환
동시 쿼리 간 상태 교차 오염 원천 차단
- 대기열 타임아웃: 하드코딩 120초 → ActiveQueryManager 설정값 사용
Phase B: 쿼리 메트릭 DB 저장
- QueryMetricsService: signal.t_query_metrics 비동기 INSERT
- QueryMetricsController: GET /api/monitoring/query-metrics, /stats
- streamChunkedTracks finally 블록에서 자동 저장 (QueryBenchmark 데이터 연동)
Phase C: N+1 해소 + 데드코드 제거
- VesselInfo 배치 프리로드: viewportVesselIds 수집 후 1회 배치 조회
- 미사용 코드 ~400줄 삭제: simplificationStrategy, executorService, processQueryInChunks,
batchGetVesselInfo, processChunk, selectTableByTimeRange, groupRangesByDate 등
Phase D: 코드 품질
- WKTReader: 싱글턴 공유 → ThreadLocal (스레드 안전성)
- avgSpeed 계산: 4곳 중복 → calculateAvgSpeed() 헬퍼 추출
2,984줄 → 2,575줄 (409줄 삭감)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SignalKindCode 매핑 변경: aton→DEFAULT, tug/tender→DEFAULT,
Vessel+towing/dredging/diving→DEFAULT, Vessel+leisure→DEFAULT
- shipName 기반 BUOY 검출: '.' '_' 문자 2개 이상 → BUOY
- 캐시 저장 시 1회 치환, API 응답 시 DB/캐시 값 직접 사용
- 응답 경로 6곳 resolve() 재계산 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1: L1/L2/L3 캐시 키 기반 직접 O(1) 조회 (전체 스캔 대체)
Phase 2: 64GB JVM 메모리 예산 논리적 파티셔닝 (캐시 35GB/쿼리 20GB)
Phase 3: L2 HourlyTrackCache 6시간 경과 엔트리 Nth-point 간소화
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- application.yml: gzip 압축 활성화 (1KB 이상 JSON 자동 압축, 70~85% 감소)
- JacksonConfig: NON_NULL 전역 설정 (null 필드 직렬화 제거, 5~15% 감소)
- VesselPositionService: sog/cog 소수점 1자리, lon/lat 6자리 제한 (3~5% 감소)
- MapTileController: @Tag, @Operation, @Parameter Swagger 문서 추가
- LockMonitorController: @Tag, @Operation Swagger 문서 추가
- BatchAdminController daily-stats: @ApiResponse 응답 스키마 예시 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostGIS ST_AsText()는 "LINESTRING M (...)" (공백 포함) 반환하지만
Java 코드는 "LINESTRING M(...)" (공백 없음) 형식만 매칭하여
앱 재시작 후 DB fallback/warmup 데이터가 전량 필터되는 버그 수정.
- DB 읽기 시 WKT 정규화 (CacheWarmup, CacheBasedReader 4곳)
- merge processor regex에 \s* 방어적 처리 (Daily/Hourly)
- countWktPoints indexOf('(') 기반으로 개선
- BatchAdmin: dailyJob 수동 실행 시 timeBucket 파라미터 추가
- DataPipeline: L3 표시를 cachedDays → totalVessels로 변경
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tailwind CSS 4의 oklch()/color-mix(in oklab) 함수를 html2canvas가
파싱하지 못하는 문제 해결 — 캡처 전 모든 요소의 색상을 브라우저
computed RGB 값으로 강제 인라인 적용 후 캡처, 완료 후 원복
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 날짜 입력 세로 배치 (좁은 사이드바 대응)
- 결과 리스트 높이 max-h-[40vh] 반응형 개선
- TimelineControl 반응형 폭 + z-index 수정
- VesselDetailModal: 임베디드 지도 + 방문이력 + 이미지 저장
- StsContactDetailModal: 2항적 지도 + 접촉통계 + 이미지 저장
- html2canvas 의존성 추가
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>