diff --git a/backend/src/main/java/com/goldenchart/service/LiveConditionStatusService.java b/backend/src/main/java/com/goldenchart/service/LiveConditionStatusService.java index 462ec09..dc47dbf 100644 --- a/backend/src/main/java/com/goldenchart/service/LiveConditionStatusService.java +++ b/backend/src/main/java/com/goldenchart/service/LiveConditionStatusService.java @@ -70,14 +70,14 @@ public class LiveConditionStatusService { return empty(market, strategyId); } - // 데이터 수신 보장 — 평가 전 해당 종목·봉 타입 pin + 동기 warm-up + // 마켓 구독 + 비동기 warm-up 시작 — 현재 봉 유무에 따라 즉시 or 수집 후 평가 Set timeframes = new LinkedHashSet<>(); for (PendingCond p : pending) { String tf = LiveStrategyTimeframeService.normalize(p.timeframe()); timeframes.add(tf); - subscriptionManager.ensureBarsReadySync(market, tf, 60); + subscriptionManager.ensureMarketPinned(market, tf); } - subscriptionManager.ensureBarsReadySync(market, "1m", 60); + subscriptionManager.ensureMarketPinned(market, "1m"); List rows = new ArrayList<>(); int met = 0; diff --git a/frontend/src/hooks/useTradeNotificationSignalSnapshot.ts b/frontend/src/hooks/useTradeNotificationSignalSnapshot.ts index 75f9afb..501a69b 100644 --- a/frontend/src/hooks/useTradeNotificationSignalSnapshot.ts +++ b/frontend/src/hooks/useTradeNotificationSignalSnapshot.ts @@ -40,7 +40,14 @@ export function useTradeNotificationSignalSnapshot( } setSnapshot(snap ?? undefined); - setLoading(false); + + // strategy 가 아직 로드되지 않았고 데이터도 없으면 loading 유지: + // strategy 가 로드되면 refresh 가 갱신되어 재시도하며, 그때 조건이 표시된다. + if (!snap && strategy === undefined) { + setLoading(true); + } else { + setLoading(false); + } }, [market, strategyId, strategy, enabled]); useEffect(() => { @@ -51,6 +58,7 @@ export function useTradeNotificationSignalSnapshot( return; } emptyRetryRef.current = 0; + setLoading(true); // 활성화 즉시 로딩 표시 void refresh(); const id = window.setInterval(() => void refresh(), pollMs); return () => {