web-frontend/src/main/v3/packages/ui/prompts/billboard-to-echarts-migration-prompt.md
아래 지시를 따라 이 프로젝트의 billboard.js 기반 차트를 Apache ECharts로 변환해 주세요.
@billboard.js/react 및 billboard.js를 사용하는 모든 차트 컴포넌트와 관련 훅을 echarts로 교체한다.LoadChart, ResponseSummaryChart, HeatmapChart 등)을 참고하여 일관된 방식으로 구현한다.@billboard.js)와 ECharts 공식 문서(@ECharts)를 반드시 참고하여 변환한다.packages/ui 패키지 내 차트 및 packages/ui/src/lib/charts 훅echarts@^6.0.0 (이미 의존성에 포함됨)cn() 유틸 사용. echarts는 tree-shaking으로 필요한 모듈만 echarts.use([...]) 하여 등록한다.UrlStatTotalCountChart.tsx를 전환해줘.」**라고 명시적으로 요청하기 전까지, 그 파일을 echarts로 변환하면 안 된다.어떤 파일을 echarts로 변환할 때는 반드시 아래 순서를 따른다.
원본 백업 생성
변환 대상 파일(예: UrlStatTotalCountChart.tsx)과 같은 디렉터리에 복사본을 만든다.
Temp를 붙인다.UrlStatTotalCountChart.tsx → UrlStatTotalCountChartTemp.tsx (같은 폴더에 생성)Temp를 붙인다. (원본과 구분되어 동시에 import 가능하도록)UrlStatTotalCountChart → UrlStatTotalCountChartTemp, UrlStatTotalCountChartProps → UrlStatTotalCountChartTempProps원본만 echarts로 변환
*Temp.tsx는 건드리지 않고, 원본 파일(UrlStatTotalCountChart.tsx)만 billboard.js 제거 후 echarts로 변환한다.
Temp 파일의 용도
*Temp.tsx는 나중에 삭제할 예정이지만, echarts 변환이 제대로 됐는지 비교·검증할 때 사용한다. 변환 작업 중에는 수정하거나 삭제하지 않는다.
요약: 사용자가 「UrlStatTotalCountChart.tsx를 전환해줘.」라고 하면 → 같은 자리에 UrlStatTotalCountChartTemp.tsx를 만들고, 원본 내용을 복사한 뒤 export된 컴포넌트·Props 이름에 Temp를 붙여 저장하고 → 그 다음 원본 UrlStatTotalCountChart.tsx만 echarts로 변환한다.
반드시 아래 파일들의 패턴을 따르세요.
packages/ui/src/components/Chart/Load/LoadChart.tsx
echarts.init(ref), ResizeObserver로 resize, dispose 정리useEffect로 인스턴스 생성/해제, 별도 useEffect로 setOption (데이터/옵션 의존)type: 'time', yAxis 포맷·툴팁 커스텀packages/ui/src/components/Chart/ResponseSummary/ResponseSummaryChart.tsx
chartRef + chartInstanceRef 사용packages/ui/src/components/Heatmap/core/HeatmapChart.tsx
echarts.use([...])공통 규칙:
chartRef = useRef<HTMLDivElement>(null), chartInstanceRef = useRef<echarts.EChartsType | null>(null)useEffect에서 echarts.init(chartRef.current), ResizeObserver 등록, cleanup에서 resizeObserver.disconnect() 및 chart.dispose()useEffect에서 chartInstanceRef.current?.setOption(...) 호출graphic으로 중앙에 텍스트 표시 (LoadChart의 emptyMessage 패턴)import * as echarts from 'echarts/core' 및 필요한 차트/컴포넌트/렌더러만 import 후 echarts.use([...]) 한 번 호출*Props (예: data, className, emptyMessage 등)는 그대로 두고, 내부 구현만 echarts로 바꾼다. 호출부(*Fetcher, *Chart.tsx 사용처) 시그니처 변경은 최소화한다.timestamp, metricValueGroups, metricValues, fieldName, valueList 등 기존 타입과 구조를 그대로 사용한다. billboard용 columns 형태는 컴포넌트 내부에서 echarts용 series/xAxis.data 등으로만 변환한다.axis.rotated: true와 맞추려면 yAxis.inverse: true로 첫 항목이 위에 오도록 설정한다.formatNewLinedDateString, abbreviateNumber, getFormat, colors 등 기존 유틸·상수는 그대로 사용한다.cn('w-full h-full', className) 등 레이아웃 클래스와 packages/ui 디자인 토큰을 유지한다.series[].label.color를 해당 막대 색과 동일하게 설정한다. (항상 “막대와 동일”이 아니라, 원본과 동일하게 적용한다.)zlevel을 사용한다. series에 zlevel: 0, xAxis/yAxis에 zlevel: 1을 주면 축·그리드가 나중에 그려져 데이터 위에 표시된다.LegendComponent를 echarts.use([...])에 포함하고, legend 옵션(data, bottom, icon, itemWidth, itemHeight, itemGap 등)을 설정하여 원본과 동일한 위치·스타일로 표시한다. grid.bottom을 넉넉히 두어 범례와 겹치지 않도록 한다.사용자가 특정 파일을 전환해 달라고 요청했을 때, 그 파일 유형에 맞게 아래를 참고한다.
*Temp.tsx 백업을 만들고, 원본만 echarts로 변환한다.chartOptions에서 타입/툴팁 정보를 받아 echarts series[].type, smooth, areaStyle 등으로 매핑한다.xAxis(value)/yAxis(category) 방향을 맞춘다. billboard.js의 axis.rotated: true와 카테고리 순서를 동일하게 하려면 ECharts의 **category 축에 inverse: true**를 설정해, 첫 번째 카테고리가 위에 오도록 한다. x축 그리드 라인(splitLine)이 데이터 막대 앞에 오게 하려면 xAxis/yAxis에 zlevel: 1, series에 zlevel: 0을 설정한다.packages/ui/package.json에서 billboard.js, @billboard.js/react를 제거한다.@billboard.js)와 ECharts 문서(@ECharts)를 참고하여 기능·스타일이 원본과 완전히 동일한지 확인yAxis.inverse: true)zlevel 사용)formatNewLinedDateString 등), 숫자 축 포맷(abbreviateNumber, getFormat) 유지emptyMessage 표시echarts.use([...])로 등록useChartType / useChartConfig / useDataSourceChartConfig 테스트 및 관련 컴포넌트 테스트 통과formatter 등에서 echarts 타입을 모를 경우 echarts 네임스페이스의 타입을 참고해 구체적인 타입을 지정한다.echarts.use([...])에만 등록해 tree-shaking이 되도록 유지한다.aria-label 등은 컨테이너 div에 유지하거나 echarts 옵션에서 지원하는 접근성 설정을 검토한다.이 프롬프트를 AI에게 준 뒤, 변환할 파일을 하나씩 지정해서 요청한다.
예: 「UrlStatTotalCountChart.tsx를 전환해줘.」
AI는 §3에 따라 사용자가 파일 이름을 지정할 때만 해당 파일을 변환하고, §4에 따라 먼저 *Temp.tsx 백업을 만든 다음 원본만 echarts로 변환한다.