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",