본문으로 건너뛰기

© 2026 Molayo

Qiita헤드라인2026. 05. 02. 16:47

FastAPI + Prophet + React 를 활용한 개인 개발 판매 예측 AI 서비스 출시 이야기

요약

이 글은 FastAPI와 Prophet(시계열 예측 모델)를 백엔드로, React를 프론트엔드로 사용하여 개인 개발 판매 예측 웹 애플리케이션 'SalesCast'를 출시한 과정을 담고 있습니다. 사용자가 CSV 파일을 업로드하면 자동으로 계절성 및 휴일 효과를 반영하여 예측 그래프를 보여주는 이 도구는 높은 진입 장벽을 낮춘 것이 특징입니다. 개발 과정에서는 React의 `useMemo`와 `html2canvas`를 활용해 통계 계산 및 그래프 다운로드를 구현했으며, FastAPI에서 CORS 설정을 명시적으로 처리하는 방법과 Render 무료 플랜 사용 시 로딩 스피너 같은 사용자 경험 개선 방안까지 공유하고 있습니다.

핵심 포인트

  • Prophet을 사용하여 복잡한 판매 예측 기능을 낮은 진입 장벽으로 구현할 수 있다.
  • React의 `useMemo`를 활용하여 지정 기간에 대한 통계(평균, 최대/최소) 계산 로직을 효율적으로 관리했다.
  • 그래프 시각화 결과를 `html2canvas`로 캡처하여 PNG 파일로 다운로드하는 기능을 추가했다.
  • FastAPI 백엔드에서 CORS 설정을 명시적으로 처리하고, 실제 운영 환경에서는 허용 출처(allow_origins)를 반드시 제한해야 한다.
  • Render와 같은 PaaS의 무료 플랜 사용 시 발생할 수 있는 지연 문제를 사용자 경험 개선을 통해 보완하는 방법을 제시했다.

SalesCast 라는 이름의 웹 애플리케이션을 개인으로 만들었습니다.

기계 학습 (Prophet) 을 백엔드로 사용하여 CSV 를 붙여넣기만 하면 예측 그래프가 나오는 간단한 도구입니다. 기술 구성, 개발 흐름, 겪었던 어려움을 정리합니다.

판매 예측은 실무에서 사용되는 기술이지만, 기존 도구는 비용이 비싸거나 도입 장벽이 높습니다. "CSV 를 붙이면 예측할 수 있는" 도구를 개인도 만들 수 있다고 생각하여 개발했습니다.

레이어사용 기술
프론트엔드React(Vite) + Recharts
백엔드FastAPI(Python)
예측 엔진Prophet(Meta 사 제품)
인프라Vercel + Render

Prophet 은 계절성 및 휴일 효과를 자동으로 모델에 포함시켜 주므로, 파라미터 튜닝이 적게 필요합니다. "CSV 를 받아서 예측에 그대로 흘려보내는"이라는 단순한 설계와 잘 어울렸습니다.

예측 데이터에 대해 표시 기간을 슬라이더로 지정할 수 있으며, 해당 범위 내의 통계 정보가 자동으로 계산됩니다.

  • 평균값
  • 최대값/최소값
  • 지정 기간의 그래프 표시
// 범위 지정 후 통계를 계산하는 예 (React)
const stats = useMemo(() => {
const filtered = forecastData.filter(
d => d.date >= rangeStart && d.date <= rangeEnd
);
const values = filtered.map(d => d.yhat);
return {
mean: values.reduce((a, b) => a + b, 0) / values.length,
max: Math.max(...values),
min: Math.min(...values),
};
}, [forecastData, rangeStart, rangeEnd]);

표시 중인 Recharts 그래프를 그대로 PNG 로 저장할 수 있습니다. html2canvas 를 사용하여 구현했습니다.

import html2canvas from "html2canvas";
const handleDownload = async () => {
const canvas = await html2canvas(chartRef.current);
const link = document.createElement("a");
link.download = "salescast_chart.png";
link.href = canvas.toDataURL();
link.click();
};

프론트엔드와 백엔드가 별도의 도메인이 되므로, CORS 의 명시적 지정이 필요합니다.

app.add_middleware(
CORSMiddleware,
allow_origins=["https://salescast.vercel.app"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

개발 중에는 allow_origins=["*"] 로 설정해 두었으나, 본업에서는 반드시 좁혀서 설정했습니다.

Render 의 무료 플랜은 아이들 시간 이후의 첫 번째 요청이 지연됩니다. 프론트엔드 측에 로딩 스핀너를 구현하여 사용자가 이탈하지 않도록 하고 있습니다.

  • FastAPI: Python 으로 빠르게 API 를 세울 수 있음. Prophet 과도 호환성이 좋음 -
  • Prophet: 시계열 예측이 간편함. 파라미터가 적고 다루기 쉬움 -
  • Recharts: React 와 조합하기 쉽고, 인터랙티브한 그래프를 만들기 쉬움

실제로 사용해 보시고 피드백을 주시면 기쁩니다.

GitHub: @Mecharhythm

AI 자동 생성 콘텐츠

본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
3

댓글

0