diff --git a/frontend/src/hooks/useKoreaData.ts b/frontend/src/hooks/useKoreaData.ts index 95b3e1a..cec7547 100644 --- a/frontend/src/hooks/useKoreaData.ts +++ b/frontend/src/hooks/useKoreaData.ts @@ -145,15 +145,24 @@ export function useKoreaData({ // Propagate Korea aircraft (live only — no waypoint propagation needed) const aircraft = useMemo(() => propagateAircraft(baseAircraftKorea, currentTime), [baseAircraftKorea, currentTime]); - // Korea region ships — pre-compute mtCategory/natGroup for O(1) filter lookups - const ships = useMemo(() => { - const propagated = propagateShips(baseShipsKorea, currentTime, isLive); - for (const s of propagated) { - s.mtCategory = getMarineTrafficCategory(s.typecode, s.category); - s.natGroup = getNationalityGroup(s.flag); - } - return propagated; - }, [baseShipsKorea, currentTime, isLive]); + // Pre-compute mtCategory/natGroup on base data change (5-min polling) + // useState 값 직접 변경 불가 → 새 배열을 ref에 저장 + const enrichedShipsRef = useRef([]); + useMemo(() => { + enrichedShipsRef.current = baseShipsKorea.map(s => ({ + ...s, + mtCategory: getMarineTrafficCategory(s.typecode, s.category), + natGroup: getNationalityGroup(s.flag), + })); + }, [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], + ); // Category-filtered data for map rendering (Set.has = O(1) per ship) const visibleAircraft = useMemo(