From 33621883dc92f6c62b2c231d8faa4d9a361ebff1 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 11 Jun 2026 14:47:31 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=B1=EC=97=94=EB=93=9C=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=ED=9B=84=20=EC=B0=A8=ED=8A=B8=202?= =?UTF-8?q?=EA=B0=9C=20=EB=B4=89=EB=A7=8C=20=ED=91=9C=EC=8B=9C=EB=90=98?= =?UTF-8?q?=EB=8A=94=20race-condition=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HistoricalDataService.getHistory: 인메모리 봉이 20개 미만이면 Upbit REST 폴백을 실행하도록 변경. 이전 동작: rawBars.isEmpty() 일 때만 Upbit 폴백 → 재시작 직후 warm-up 미완료 상태에서 2~3개 봉이 메모리에 있으면 inMemory=true로 판정 후 Upbit 폴백 없이 2~3개 봉만 반환됨 수정 동작: rawBars.size() < 20 이면 Upbit REST 재조회 → warm-up 완료 전에도 최소 200개 봉을 반환 보장 → 차트 2개 캔들 표시 및 OBV plot1 누락 경고 해소 Co-authored-by: Cursor --- .../goldenchart/service/HistoricalDataService.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/goldenchart/service/HistoricalDataService.java b/backend/src/main/java/com/goldenchart/service/HistoricalDataService.java index c9b5c97..c665c26 100644 --- a/backend/src/main/java/com/goldenchart/service/HistoricalDataService.java +++ b/backend/src/main/java/com/goldenchart/service/HistoricalDataService.java @@ -81,9 +81,17 @@ public class HistoricalDataService { rawBars = sliceFromMemory(market, candleType, toTime, safeCount); } - if (rawBars.isEmpty()) { - log.debug("[HistoricalDataService] 업비트 REST 프록시: {} / {} / to={}", market, candleType, to); - rawBars = fetchFromUpbit(market, candleType, to, safeCount); + // 인메모리 봉이 최소 임계치(20개) 미만이면 Upbit REST 로 재조회. + // 백엔드 재시작 직후 warm-up 미완료 상태에서 2~3개 봉만 반환되는 + // race-condition 을 방지한다. + final int MIN_BARS_THRESHOLD = 20; + if (rawBars.size() < Math.min(MIN_BARS_THRESHOLD, safeCount)) { + log.info("[HistoricalDataService] 인메모리 봉 부족({}) → 업비트 REST 프록시: {} / {}", + rawBars.size(), market, candleType); + List upbitBars = fetchFromUpbit(market, candleType, to, safeCount); + if (upbitBars.size() > rawBars.size()) { + rawBars = upbitBars; + } } if (rawBars.isEmpty()) return Collections.emptyList();