/** * @module useQueryManager * @description 리포트에 연결된 SQL 쿼리 목록과 실행 결과 캐시를 관리한다. * - queries: 저장/편집 대상 쿼리 정의 목록 * - queryResults: 각 쿼리의 마지막 실행 결과 (캐시) */ import { useState, useCallback } from "react"; import type { ReportQuery, QueryResult } from "./types"; export interface QueryManagerState { queries: ReportQuery[]; setQueries: (queries: ReportQuery[]) => void; queryResults: QueryResult[]; setQueryResult: (queryId: string, fields: string[], rows: Record[]) => void; getQueryResult: (queryId: string) => QueryResult | null; } export function useQueryManager(): QueryManagerState { const [queries, setQueries] = useState([]); const [queryResults, setQueryResults] = useState([]); /** * 특정 쿼리의 실행 결과를 캐시에 저장/갱신한다. * 동일 queryId가 이미 있으면 덮어쓰고, 없으면 추가한다. */ const setQueryResult = useCallback((queryId: string, fields: string[], rows: Record[]) => { setQueryResults((prev) => { const exists = prev.some((r) => r.queryId === queryId); if (exists) { return prev.map((r) => (r.queryId === queryId ? { queryId, fields, rows } : r)); } return [...prev, { queryId, fields, rows }]; }); }, []); /** 쿼리 ID로 캐시된 실행 결과를 조회한다. 없으면 null 반환. */ const getQueryResult = useCallback( (queryId: string): QueryResult | null => { return queryResults.find((r) => r.queryId === queryId) ?? null; }, [queryResults], ); return { queries, setQueries, queryResults, setQueryResult, getQueryResult }; }