From 3d03c47aaac7a7eb176b0b0625feec080847d91b Mon Sep 17 00:00:00 2001 From: jungwoo choi Date: Fri, 13 Feb 2026 17:50:14 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=A7=84=ED=96=89=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=A6=AC=EB=A1=9C=EB=93=9C=20=EC=8B=9C=20=EB=AC=B4?= =?UTF-8?q?=ED=95=9C=20=EB=A1=9C=EB=94=A9=20+=20=EB=8F=99=EC=8B=9C=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20=EC=88=98=20=EC=83=81=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 리로드 시 API에서 현재 상태를 조회하여 스토어 복원 (initFromApi) - SITE_CONCURRENCY 서버 상한 4→8로 변경 (사용자 설정 8이 제대로 동작) Co-Authored-By: Claude Opus 4.6 --- backend/app/core/config.py | 2 +- .../site-inspection/SiteCrawlProgress.tsx | 12 ++++++++++++ frontend/src/stores/useSiteInspectionStore.ts | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/backend/app/core/config.py b/backend/app/core/config.py index 17adeca..8724e0e 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -24,7 +24,7 @@ class Settings(BaseSettings): # Site inspection SITE_MAX_PAGES: int = 500 SITE_MAX_DEPTH: int = 2 - SITE_CONCURRENCY: int = 4 + SITE_CONCURRENCY: int = 8 # Application PROJECT_NAME: str = "Web Inspector API" diff --git a/frontend/src/components/site-inspection/SiteCrawlProgress.tsx b/frontend/src/components/site-inspection/SiteCrawlProgress.tsx index c526c21..8d26944 100644 --- a/frontend/src/components/site-inspection/SiteCrawlProgress.tsx +++ b/frontend/src/components/site-inspection/SiteCrawlProgress.tsx @@ -1,7 +1,9 @@ "use client"; +import { useEffect } from "react"; import { useSiteInspectionStore } from "@/stores/useSiteInspectionStore"; import { useSiteInspectionSSE } from "@/hooks/useSiteInspectionSSE"; +import { useSiteInspectionResult } from "@/lib/queries"; import { Progress } from "@/components/ui/progress"; import { Card, CardContent } from "@/components/ui/card"; import { ErrorState } from "@/components/common/ErrorState"; @@ -36,8 +38,18 @@ export function SiteCrawlProgress({ discoveredPages, aggregateScores, errorMessage, + initFromApi, } = useSiteInspectionStore(); + // API에서 현재 상태 조회 (리로드 시 스토어 복원용) + const { data: apiResult } = useSiteInspectionResult(siteInspectionId); + + useEffect(() => { + if (apiResult && status === "idle") { + initFromApi(apiResult); + } + }, [apiResult, status, initFromApi]); + // SSE 연결 useSiteInspectionSSE(siteInspectionId); diff --git a/frontend/src/stores/useSiteInspectionStore.ts b/frontend/src/stores/useSiteInspectionStore.ts index 7fb5a65..5fa6810 100644 --- a/frontend/src/stores/useSiteInspectionStore.ts +++ b/frontend/src/stores/useSiteInspectionStore.ts @@ -3,6 +3,7 @@ import type { DiscoveredPage, AggregateScores, SiteInspectionPhase, + SiteInspectionResult, CrawlProgress, SSECrawlComplete, SSEPageComplete, @@ -21,6 +22,7 @@ interface SiteInspectionState { // Actions setSiteInspection: (id: string, rootUrl: string) => void; + initFromApi: (data: SiteInspectionResult) => void; setCrawlProgress: (pagesFound: number, currentUrl: string) => void; setCrawlComplete: (data: SSECrawlComplete) => void; updatePageStatus: ( @@ -63,6 +65,23 @@ export const useSiteInspectionStore = create( status: "crawling", }), + initFromApi: (data) => + set((state) => { + // Only init if store is idle (prevents overwriting live SSE data) + if (state.status !== "idle") return state; + return { + siteInspectionId: data.site_inspection_id, + rootUrl: data.root_url, + status: data.status as SiteInspectionPhase, + discoveredPages: data.discovered_pages, + aggregateScores: data.aggregate_scores, + crawlProgress: { + pagesFound: data.discovered_pages.length, + currentUrl: "", + }, + }; + }), + setCrawlProgress: (pagesFound, currentUrl) => set({ status: "crawling",