From b6b056c3b58be80d92336370cf657d57223c4498 Mon Sep 17 00:00:00 2001 From: Macbook Date: Sun, 7 Jun 2026 02:39:02 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=8C=EB=A6=BC=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A7=80=ED=91=9C=EC=97=86=EC=9D=8C=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/LiveConditionStatusService.java | 6 +++--- .../src/hooks/useTradeNotificationSignalSnapshot.ts | 10 +++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) 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 () => {