From 459a0e3d6ebd7d13084d601981396e065331b120 Mon Sep 17 00:00:00 2001 From: htlee Date: Mon, 23 Mar 2026 12:39:50 +0900 Subject: [PATCH] =?UTF-8?q?perf:=20LIVE=20=EB=AA=A8=EB=93=9C=20=EB=A7=A4?= =?UTF-8?q?=EC=B4=88=20=EC=84=A0=EB=B0=95=20=EC=9E=AC=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=E2=80=94=20currentTime=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=99=84=EC=A0=84=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - liveShips: baseShipsKorea 변경(5분 polling) 시에만 계산. currentTime 의존성 없음. - replayShips: REPLAY 모드에서만 currentTime으로 위치 보간. - LIVE 모드: 매초 useMemo 실행 자체가 발생하지 않음. Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/hooks/useKoreaData.ts | 31 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/frontend/src/hooks/useKoreaData.ts b/frontend/src/hooks/useKoreaData.ts index cec7547..71272b0 100644 --- a/frontend/src/hooks/useKoreaData.ts +++ b/frontend/src/hooks/useKoreaData.ts @@ -145,24 +145,27 @@ export function useKoreaData({ // Propagate Korea aircraft (live only — no waypoint propagation needed) const aircraft = useMemo(() => propagateAircraft(baseAircraftKorea, currentTime), [baseAircraftKorea, currentTime]); - // Pre-compute mtCategory/natGroup on base data change (5-min polling) - // useState 값 직접 변경 불가 → 새 배열을 ref에 저장 - const enrichedShipsRef = useRef([]); - useMemo(() => { - enrichedShipsRef.current = baseShipsKorea.map(s => ({ + // LIVE: baseShipsKorea 변경(5분 polling) 시에만 재계산. currentTime 무관. + // REPLAY: currentTime으로 활성 선박 + 웨이포인트 보간 필요. + const liveShips = useMemo(() => + baseShipsKorea.map(s => ({ ...s, mtCategory: getMarineTrafficCategory(s.typecode, s.category), natGroup: getNationalityGroup(s.flag), - })); - }, [baseShipsKorea]); + })), + [baseShipsKorea]); - // Korea region ships - // LIVE: enrichedShipsRef 동일 참조 반환 → 하위 useMemo 재실행 방지 (매초 currentTime 변경 무시) - // REPLAY: propagateShips로 위치 보간 → 새 배열 반환 (mtCategory는 spread로 상속) - const ships = useMemo( - () => isLive ? enrichedShipsRef.current : propagateShips(enrichedShipsRef.current, currentTime, false), - [baseShipsKorea, currentTime, isLive], - ); + const replayShips = useMemo(() => { + if (isLive) return liveShips; // REPLAY 아니면 계산 안 함 + const propagated = propagateShips(baseShipsKorea, currentTime, false); + for (const s of propagated) { + s.mtCategory = getMarineTrafficCategory(s.typecode, s.category); + s.natGroup = getNationalityGroup(s.flag); + } + return propagated; + }, [isLive, baseShipsKorea, currentTime, liveShips]); + + const ships = isLive ? liveShips : replayShips; // Category-filtered data for map rendering (Set.has = O(1) per ship) const visibleAircraft = useMemo(