perf: API 응답 최적화 + 점진적 렌더링 + 해구 choropleth 지도 #38

병합
htlee feature/dashboard-phase-1 에서 develop 로 1 commits 를 머지했습니다 2026-02-19 20:25:53 +09:00
소유자

변경 사항

백엔드 SQL 최적화 (5개 API)

  • haegu/realtime: DB 공간 JOIN(12s) → 인메모리 캐시 순회(~50ms)
  • batch/statistics: N+1 JobExplorer(1.1s) → 단일 SQL 집계(~100ms)
  • batch/daily-stats: N+1×7일(9s) → 직접 SQL 2쿼리(~200ms)
  • throughput: pg_total_relation_size 반복(1.4s) → Caffeine 5분 캐시
  • quality: 풀스캔(0.6s) → 24시간 범위 제한

프론트엔드 성능

  • Promise.allSettled 차단 → 개별 .then() 점진적 렌더링
  • useCachedState 훅: 페이지 전환 시 이전 데이터 즉시 표시

해구 choropleth 지도

  • AreaStats에 MapLibre GL JS 해구 폴리곤 지도 추가
  • 선박수 기반 색상 스케일 + 범례 + hover 팝업

테스트

  • Maven 빌드 성공
  • TypeScript 빌드 성공
  • 서버 배포 후 API 응답시간 검증
## 변경 사항 ### 백엔드 SQL 최적화 (5개 API) - `haegu/realtime`: DB 공간 JOIN(12s) → 인메모리 캐시 순회(~50ms) - `batch/statistics`: N+1 JobExplorer(1.1s) → 단일 SQL 집계(~100ms) - `batch/daily-stats`: N+1×7일(9s) → 직접 SQL 2쿼리(~200ms) - `throughput`: pg_total_relation_size 반복(1.4s) → Caffeine 5분 캐시 - `quality`: 풀스캔(0.6s) → 24시간 범위 제한 ### 프론트엔드 성능 - Promise.allSettled 차단 → 개별 .then() 점진적 렌더링 - useCachedState 훅: 페이지 전환 시 이전 데이터 즉시 표시 ### 해구 choropleth 지도 - AreaStats에 MapLibre GL JS 해구 폴리곤 지도 추가 - 선박수 기반 색상 스케일 + 범례 + hover 팝업 ## 테스트 - [x] Maven 빌드 성공 - [x] TypeScript 빌드 성공 - [ ] 서버 배포 후 API 응답시간 검증
htlee added 1 commit 2026-02-19 20:25:44 +09:00
백엔드:
- haegu/realtime: DB 공간 JOIN(12s) → 인메모리 캐시 순회(~50ms)
- batch/statistics: N+1 JobExplorer(1.1s) → 단일 SQL 집계(~100ms)
- batch/daily-stats: N+1×7일(9s) → 직접 SQL 2쿼리(~200ms)
- throughput: pg_total_relation_size 매번 호출(1.4s) → Caffeine 5분 캐시
- quality: 풀스캔(0.6s) → 24시간 범위 제한

프론트엔드:
- Promise.allSettled 차단 → 개별 .then() 점진적 렌더링
- useCachedState 훅: 페이지 전환 시 이전 데이터 즉시 표시
- AreaStats: 해구 폴리곤 choropleth 지도 + 선박수 범례 추가

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

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

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