커밋 그래프

54 커밋

작성자 SHA1 메시지 날짜
e70def6611 Merge pull request 'chore: AIS API 인증 정보 추가 (prod)' (#17) from develop into main
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 2m32s
2026-02-19 18:08:56 +09:00
e8f17dbd9a Merge pull request 'chore: AIS API 인증 정보 추가' (#16) from feature/dashboard-phase-1 into develop 2026-02-19 18:08:53 +09:00
61d68bb57b chore: AIS API 인증 정보 추가 (prod)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 18:08:26 +09:00
318d2aefbb Merge pull request 'Release: Phase 2 — DataPipeline + AreaStats' (#15) from develop into main
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 2m31s
2026-02-19 17:56:58 +09:00
53e8c2eb02 Merge pull request 'feat: Phase 2 — 데이터 파이프라인 + 해구 통계 페이지' (#14) from feature/dashboard-phase-1 into develop 2026-02-19 17:56:20 +09:00
23e33fe4bb feat: Phase 2 — 데이터 파이프라인 + 해구 통계 페이지
- DataPipeline: 4단계 흐름도(PipelineChart), L1/L2/L3 캐시 현황, 일별 처리량 추이(LineChart), 최근 실행 이력
- AreaStats: 대해구별 선박 통계 테이블, 처리량(파티션 크기), 데이터 품질 검증
- LineChart, PipelineChart 차트 컴포넌트 신규
- API 타입 추가 (CacheDetails, HaeguStat, ThroughputMetrics, DataQuality)
- monitorApi에 getCacheDetails, getHaeguRealtimeStats, getQuality 추가
- i18n pipeline.*, area.* 번역 키 추가 (ko/en)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:55:52 +09:00
478aa44e59 Merge pull request 'Release: Dashboard API 연동 오류 수정 + Phase 1 안정화' (#13) from develop into main
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 2m31s
2026-02-19 17:35:31 +09:00
dca887b292 Merge pull request 'fix: Dashboard API 연동 오류 수정 — 캐시 모니터링 + 렌더링 안전성' (#12) from feature/dashboard-phase-1 into develop 2026-02-19 17:34:23 +09:00
631454f8c4 fix: Dashboard API 연동 오류 수정 — 캐시 모니터링 + 렌더링 안전성
- CacheMonitoringController: @ConditionalOnProperty 제거, 5개 캐시 통합 집계
- MonitoringController: delay API에서 delayMinutes/status 항상 반환
- FiveMinTrackCache/HourlyTrackCache: getStatsMap() 메서드 추가
- App.tsx: Suspense fallback + ErrorBoundary 추가
- Dashboard.tsx: nullable 필드 방어 (?? 연산자)
- formatters.ts: formatNumber null 안전 처리

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 17:33:08 +09:00
997dad8117 Merge pull request 'feat: React 19 SPA Dashboard Phase 1 + 안전 배포 시스템' (#11) from feature/dashboard-phase-1 into main
All checks were successful
Build & Deploy / build-and-deploy (push) Successful in 2m30s
Reviewed-on: #11
2026-02-19 17:09:18 +09:00
76f71fb374 Merge pull request 'feat: React 19 SPA Dashboard Phase 1 + 안전 배포 시스템' (#10) from feature/dashboard-phase-1 into develop
Reviewed-on: #10
2026-02-19 17:09:04 +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
941fb3cf4a Merge pull request 'release: Gitea Actions CI/CD 파이프라인 + systemd 서비스 구성' (#9) from develop into main
Some checks failed
Build & Deploy / build-and-deploy (push) Failing after 3m6s
Reviewed-on: #9
2026-02-19 14:32:05 +09:00
fb1a9f21f2 Merge pull request 'ci: Gitea Actions CI/CD 파이프라인 + systemd 서비스 구성' (#8) from feature/multilevel-track-cache into develop 2026-02-19 14:30:37 +09:00
2838af323b ci: Gitea Actions CI/CD 파이프라인 + systemd 서비스 구성
- .gitea/workflows/deploy.yml: main push → 빌드 → SSH 배포 → 헬스체크
  - JDK 17 + Maven 빌드, JAR 원자적 교체, 백업 5세대 유지
  - 90초 startup 대기 (64GB 힙 AlwaysPreTouch)
- deploy/signal-batch.service: systemd 유닛 파일
  - 64GB 힙, G1GC 24 병렬스레드, GC 로그 5×100MB 로테이션
  - on-failure 자동 재시작, graceful shutdown (SIGTERM 60s)
- application-prod.yml: 64코어/250GB 서버 최적화 (파티션 32, 커넥션 풀 정리)
- 미사용 프로필 삭제: application-dev.yml, application-prod-mpr.yml, application-query.yml

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 14:30:02 +09:00
b9ace1681c Merge pull request 'release: SNP API 전환 + 인메모리 캐시 최적화 + 다계층 캐시 조회 통합' (#7) from develop into main
Reviewed-on: #7
2026-02-19 14:26:30 +09:00
29bf116246 Merge pull request 'feat: 다계층 인메모리 캐시(L1/L2/L3) 조회 통합 + CACHE-MONITOR 로그' (#6) from feature/multilevel-track-cache into develop 2026-02-19 13:34:22 +09:00
bfc4614ce7 Merge pull request 'feat: Stale 데이터 비정상 궤적 전환 + vesselStatic N+1 쿼리 제거' (#5) from feature/stale-data-abnormal-track into develop 2026-02-19 13:34:12 +09:00
5f0ef5e812 Merge pull request 'perf: Hourly Job 인메모리 병합 전환 — N+1 SQL 제거' (#4) from feature/hourly-inmemory-merge into develop 2026-02-19 13:33:30 +09:00
daab14f0ad Merge pull request 'chore: 팀 워크플로우 초기 구성 + SNP API 전환 및 레거시 정리' (#3) from chore/team-workflow-init into develop 2026-02-19 13:32:37 +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
4dd40b7231 perf: vesselStaticSyncStep N+1 쿼리 제거 — DISTINCT ON bulk SELECT로 전환
이전: MMSI별 개별 SELECT (~10만 쿼리) → 수 분 소요
이후: DISTINCT ON (mmsi) 1회 bulk SELECT → 인메모리 CDC 비교

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 12:17:16 +09:00
a6d886c61b fix: hourly job timeBucket 파라미터 문자열 "hourly" → 실제 시간값 전달
VesselBatchScheduler에서 hourlyAggregationJob 실행 시 timeBucket 파라미터에
"hourly" 문자열을 전달하여 HourlyTrackMergeProcessor의 LocalDateTime.parse() 실패.
startTime (정시 값)을 전달하도록 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 11:12:49 +09:00
732f69eb02 feat: Stale 데이터 비정상 궤적 전환 — 과거 timestamp 수신 시 정보 보존
- 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>
2026-02-19 11:09:27 +09:00
82ae4d9ef5 perf: Hourly Job 인메모리 병합 전환 — N+1 SQL 제거
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>
2026-02-19 10:11:55 +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
e3816e6ecb Merge pull request 'fix(rules): SLF4J 로깅 지침 추가' (#2) from fix/logging-guideline into develop 2026-02-19 07:29:27 +09:00
636760dd1d fix(rules): SLF4J 로깅 지침 추가 (printf 포맷 사용 금지) 2026-02-19 07:29:13 +09:00
b749417fc5 Merge pull request 'chore: 팀 워크플로우 v1.2.0 초기 구성 (java-maven)' (#1) from chore/team-workflow-init into develop
Reviewed-on: #1
2026-02-18 20:56:04 +09:00
a98fdcbdc9 chore: 팀 워크플로우 v1.2.0 초기 구성 (java-maven)
- .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>
2026-02-18 20:52:38 +09:00
63022a63ff chore: 팀 Gitea 전환 준비 (.gitignore 표준화 + 정리)
- .gitignore: .claude, *.md, scripts/ 포괄 무시 → 선택적 무시로 전환
- .claude.bak/ 삭제 (불필요 백업)
- .claudeignore 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 20:44:26 +09:00
LHT
28e6887379 fix: WebSocket OOM 방지 — 버퍼 256MB→2MB + 힙 기반 Admission Control
근본 원인: maxTextMessageBufferSize=256MB가 세션당 Humongous 객체 유발
- 100세션 × 256MB = 25.6GB G1GC 회수 불가 Humongous 리전 누적 → OOM

변경 내역:
- WebSocketStompConfig: 컨테이너 버퍼 256MB→2MB, SockJS stream 100MB→5MB
- WebSocketProperties: sendBuffer 256→50MB, outboundQueue 5000→200, msgLimit 50→2MB
- YAML(prod/prod-mpr/query): websocket.transport 섹션 명시적 추가
- ActiveQueryManager: 힙 사용률 85% 초과 시 쿼리 대기열 전환
- ChunkedTrackStreamingService: 중간 컬렉션 clear()/null 즉시 해제
- GisServiceV2: 캐시 원본 보호 toBuilder().build() + 중간 컬렉션 해제
- StompTrackController: activeSessions COMPLETED/ERROR 시 자동 제거
- AsyncConfig: 스레드풀 core 40→15, max 120→30

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 16:37:48 +09:00
LHT
fb72be89a1 feat: 비정상 접촉 선박 탐색 API (POST /api/v2/tracks/vessel-contacts)
인메모리 캐시 기반으로 폴리곤 내 일정 시간/거리 이내 선박 쌍 탐색.
Two-pointer 시간 동기화 + 평균 거리 기반 접촉 판정 + 환적 의심 지표.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 11:53:50 +09:00
LHT
a3de69772a feat: area-search 개별 방문(trip) 분리 + 경계 보간 타임스탬프
- 모든 모드(ANY/ALL/SEQUENTIAL)에서 동일 구역 재방문 시 개별 방문 단위로 분리
- PolygonHitDetail에 visitIndex 필드 추가 (구역별 방문 순번, 1-based)
- 진입/진출 시각을 JTS LineSegment.intersection() 기반 거리 비율 보간으로 산출
- SEQUENTIAL 모드: greedy chain 탐색, 유효 체인만 반환 (visitIndex=1 재설정)
- hitDetails 배열을 entryTimestamp 오름차순 정렬 (배열 인덱스 = 전체 방문 순서)
- Swagger 설명에 개별 방문 분리, 경계 보간 관련 내용 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 08:32:32 +09:00
LHT
1480990f4f feat: REST V2 캐시 우선 조회 + Semaphore 부하 제어 + 응답 포인트 상한
- POST /api/v2/tracks/vessels: DailyTrackCacheManager 캐시-DB 분리 조회
- 모든 V2 항적 엔드포인트에 ActiveQueryManager 공유 Semaphore 적용
- 포인트 버짓: 총 포인트 초과 시 비율 기반 균등 분배 간소화
- prod/prod-mpr/query 프로파일에 rest.v2.query 설정 추가
- 원격 DB 필요 테스트 @Disabled 처리, Maven Wrapper/gitattributes 정비

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 06:43:02 +09:00
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
51f588476f fix: IntegrationVessel table-name @Value 경로 불일치 수정
vessel.integration.datasource.table-name → vessel.integration.table-name으로 변경.
YAML 구조와 불일치하여 prod에서 기본값(signal.t_ship_integration_sub)이 사용되었고,
별도 DB(mdadb2 gis 스키마)에 signal 스키마가 없어 조회 실패하던 문제 해결.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 09:07:08 +09:00
b4221c36fd feat: 다중 폴리곤 영역 탐색 REST API + STRtree 공간 인덱스 (Phase 8)
캐시 기반 인메모리 다중 폴리곤 영역 내 선박 탐색 API 구현.
JTS STRtree + PreparedGeometry로 고속 공간 검색, ANY/ALL/SEQUENTIAL 3가지 모드 지원.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 08:38:18 +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
e9d5d36928 fix: 캐시-DB 하이브리드 조회 시 뷰포트 2-pass 필터링 정합성 보장
문제: 캐시 경로에서 뷰포트 공간 필터를 이중 적용하여,
다른 날짜에서 뷰포트를 통과한 선박의 항적이 누락되는 버그

수정 내용:
- collectViewportVesselIds: 캐시된 날짜는 메모리에서 뷰포트 체크 (DB 커넥션 절약)
- processDailyStrategy: viewportVesselIds(2-pass 결과) 있으면 vessel ID 필터만 적용,
  공간 필터 재적용 금지 → 전체 조회기간 항적 무결성 보장
- processQueryInChunks: 동일 패턴 적용
- StompTrackStreamingService: 캐시 경로에 filteredVessels 필터 적용

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:56:56 +09:00
dc586dde0c docs: Phase 5~6 구현 진행 문서 및 성능 보고서 업데이트
- implementation-progress.md: Phase 5~6 체크리스트 추가 (전항목 완료)
- websocket-performance-improvement-report.md: 대기열 구조, 캐시 아키텍처 설명 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:34:32 +09:00
03b14e687a feat: 일일 데이터 인메모리 캐시 구현 (Phase 6)
- DailyTrackCacheManager: D-1~D-7 daily 테이블 데이터 인메모리 캐시
  - @Async 비동기 워밍업 (서버 시작 차단 없음, 최근 우선 로드)
  - 뷰포트 필터링, 다중 날짜 병합 조회, 하이브리드 쿼리 분리
  - 메모리 한도 체크 (기본 5GB), 날짜별 즉시 활성화
- DailyTrackCacheProperties: enabled, retentionDays, maxMemoryGb 설정
- DailyAggregationJobConfig: 배치 완료 시 캐시 자동 갱신 리스너
- ChunkedTrackStreamingService: daily 전략에서 캐시 우선 조회 + DB 폴백
- StompTrackStreamingService: 동일 캐시 우선 패턴 적용
- WebSocketMonitoringController: GET /api/websocket/daily-cache 엔드포인트
- application-prod.yml: cache.daily-track 설정 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 15:34:20 +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
60366816a6 docs: 구현 진행 문서 최종 업데이트 - 전 단계 완료
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:46:06 +09:00
c92bf0e5ad feat: WebSocket 설정 외부화 및 부하 제어 모니터링 엔드포인트 추가
Phase 4: 설정 외부화 및 모니터링
- WebSocketProperties: websocket.* 설정을 @ConfigurationProperties로 바인딩
  - query: 동시 제한, 세션 제한, 대기 큐 타임아웃
  - transport: 인바운드/아웃바운드 채널 스레드풀, 메시지 크기
  - backpressure: 버퍼 크기, 메시지 크기 제한
- WebSocketMonitoringController에 /api/websocket/load-control 엔드포인트 추가
  - 글로벌 동시 쿼리 수, 대기 큐 현황
  - 활성 쿼리 상세 (세션ID, 쿼리ID, 시작시간, 진행테이블, 청크수, 취소여부)
  - 메모리 사용률

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:45:41 +09:00
7b7e283ea4 perf: 백프레셔 메커니즘 고도화 - 정확한 버퍼 추적 및 적응형 지연
Phase 3: 백프레셔 고도화
- ChunkedTrackStreamingService:
  - CompletableFuture+Thread.sleep(100ms) 추정 방식 제거
  - 전송 완료 후 try-finally에서 즉시 버퍼 크기 감소 (정확한 추적)
  - 정적 대기 → 버퍼 사용률(%) 기반 4단계 적응형 지연
- StompTrackStreamingService:
  - 총 트랙 수 기반 정적 지연 제거
  - BlockingQueue 사용률 + 데이터 크기 복합 적응형 지연으로 교체

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:43:50 +09:00
28908e1a0d refactor: 쿼리 생명주기 관리를 서비스 finally 블록으로 단일화
Phase 2.2: 쿼리 관리 시스템 통합
- StompTrackController의 status callback에서 activeQueryManager.completeQuery() 제거
- 리소스 정리를 서비스(ChunkedTrack/StompTrack) finally 블록에서 일괄 처리
- 중복 completeQuery 호출 제거로 쿼리 생명주기 관리 단일화

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:42:05 +09:00
e073007dc2 feat: ChunkedTrackStreamingService 쿼리 취소 로직 구현
Phase 2.1: 기존 TODO만 있던 cancelQuery()에 실제 취소 메커니즘 추가
- 쿼리별 AtomicBoolean 취소 플래그(queryCancelFlags) 관리
- streamChunkedTracks 시작 시 취소 플래그 등록, finally에서 정리
- 테이블 전략별 루프 진입 전 취소 확인
- isQueryCancelled()에 queryCancelFlags 통합 확인 추가
- cancelQuery() 호출 시 플래그 설정으로 진행 중인 스트리밍 중단

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:40:55 +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
21916716bf fix: CancellableQueryManager의 CachedThreadPool을 제한된 ThreadPoolExecutor로 교체
Phase 1.3: 무제한 스레드 생성 방지
- newCachedThreadPool → ThreadPoolExecutor(core:5, max:20, queue:100)
- CallerRunsPolicy 적용으로 큐 포화 시 자연 백프레셔
- 부하 시 무제한 스레드 생성으로 인한 OOM/컨텍스트 스위칭 오버헤드 방지

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 13:37:17 +09:00