refactor(websocket): ChunkedTrackStreamingService 전수 최적화 #89

병합
htlee feature/websocket-replay-optimization 에서 develop 로 2 commits 를 머지했습니다 2026-03-02 15:34:41 +09:00
소유자

변경 사항

  • isQueryCancelled 치명적 버그 수정: queryCancelFlags 전체 순회 → queryId 직접 조회 (O(n)→O(1))
  • QueryContext 추출: @Service 싱글턴 인스턴스 변수 5개 → 쿼리별 로컬 객체 (스레드 안전성)
  • 타임아웃 통일: 하드코딩 120초 → ActiveQueryManager 설정값
  • 쿼리 메트릭 DB 저장: signal.t_query_metrics + QueryMetricsService 비동기 INSERT + REST API
  • 데드코드 ~400줄 삭제: processQueryInChunks, batchGetVesselInfo 등 7개 메서드 + 4개 필드
  • VesselInfo N+1 해소: viewportVesselIds 수집 후 preloadVesselInfoWithSessionCache 1회 배치 프리로드
  • WKTReader ThreadLocal: 싱글턴 공유 → ThreadLocal (thread-safety)
  • avgSpeed 중복 추출: 4곳 × 25줄 → calculateAvgSpeed() 헬퍼

결과: 2,984줄 → 2,575줄 (409줄 삭감), 6파일 변경

신규 API

  • GET /api/monitoring/query-metrics?limit=50 — 최근 쿼리 메트릭 조회
  • GET /api/monitoring/query-metrics/stats?days=7 — 기간별 통계

DDL (배포 전 수동 실행 필요)

  • src/main/resources/sql/create_query_metrics_table.sql

테스트

  • mvn clean package -DskipTests 빌드 성공
  • 로컬 앱 기동 + API 응답 확인 (query-metrics, stats)
  • 배포 후 WebSocket 리플레이 정상 동작 확인
## 변경 사항 - **isQueryCancelled 치명적 버그 수정**: queryCancelFlags 전체 순회 → queryId 직접 조회 (O(n)→O(1)) - **QueryContext 추출**: @Service 싱글턴 인스턴스 변수 5개 → 쿼리별 로컬 객체 (스레드 안전성) - **타임아웃 통일**: 하드코딩 120초 → ActiveQueryManager 설정값 - **쿼리 메트릭 DB 저장**: signal.t_query_metrics + QueryMetricsService 비동기 INSERT + REST API - **데드코드 ~400줄 삭제**: processQueryInChunks, batchGetVesselInfo 등 7개 메서드 + 4개 필드 - **VesselInfo N+1 해소**: viewportVesselIds 수집 후 preloadVesselInfoWithSessionCache 1회 배치 프리로드 - **WKTReader ThreadLocal**: 싱글턴 공유 → ThreadLocal (thread-safety) - **avgSpeed 중복 추출**: 4곳 × 25줄 → calculateAvgSpeed() 헬퍼 결과: 2,984줄 → 2,575줄 (409줄 삭감), 6파일 변경 ## 신규 API - `GET /api/monitoring/query-metrics?limit=50` — 최근 쿼리 메트릭 조회 - `GET /api/monitoring/query-metrics/stats?days=7` — 기간별 통계 ## DDL (배포 전 수동 실행 필요) - `src/main/resources/sql/create_query_metrics_table.sql` ## 테스트 - [x] `mvn clean package -DskipTests` 빌드 성공 - [x] 로컬 앱 기동 + API 응답 확인 (query-metrics, stats) - [ ] 배포 후 WebSocket 리플레이 정상 동작 확인
htlee added 2 commits 2026-03-02 15:29:15 +09:00
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>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
claude-bot 이 변경사항을 승인하였습니다. 2026-03-02 15:34:40 +09:00
claude-bot left a comment
멤버

MR 승인 (via /mr skill)

MR 승인 (via /mr skill)
htlee merged commit 95b1ba6913 into develop 2026-03-02 15:34:41 +09:00
htlee 삭제된 브랜치 feature/websocket-replay-optimization 2026-03-02 15:34:41 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

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

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