본문 바로가기
AI/AI 활용 기초

CSV 파일만 올리면 매출 차트가 보인다, 업무 대시보드 만들기

by 고돌한 AI 2026. 9. 15.
반응형
노트북의 CSV 업무 대시보드와 코드 편집기가 놓인 개발 환경 대표 이미지

CSV 파일만 올리면 매출 차트가 보인다, 업무 대시보드 만들기

매주 CSV를 열고 합계를 다시 내고 차트를 복사한다면, 먼저 자동화할 계산 규칙을 적은 뒤 Streamlit 대시보드로 옮기면 됩니다. 바이브코딩에서 중요한 건 긴 프롬프트가 아니라 필수 열·계산식·오류 처리·정답 비교 기준을 먼저 고정하는 것입니다.

30초 요약

  • 입력 CSV의 필수 열은 날짜, 담당자, 매출로 고정합니다.
  • 결과는 총매출, 거래 건수, 담당자별 매출, 원본 표까지만 먼저 만듭니다.
  • 빈 파일·누락 열·문자형 매출·인코딩 오류를 정상 파일만큼 중요하게 시험합니다.
  • 개인정보 열은 화면에서 숨기는 데 그치지 말고 데이터에서 제거합니다.

이걸 만들면 무엇이 달라질까요?

기존에는 CSV를 열 때마다 피벗 테이블과 차트를 다시 만들고, 지난 보고서의 수식 범위를 복사했는지 확인해야 했습니다. 작은 대시보드는 같은 형식의 CSV를 올리면 정해 둔 계산을 다시 수행해 같은 기준의 지표·차트·표를 보여줍니다.

아래는 실제 앱이 아니라 완성 구조를 설명하는 정적 예시 화면입니다. 숫자는 모두 예시 데이터이며 업로드 기능도 작동하지 않습니다.

예시 데이터 · 정적 화면

월간 매출 대시보드

총매출

660,000원

거래 건수

3건

담당자별 매출

김하늘 380,000원

이바다 280,000원

날짜 담당자 매출
2026-09-01 김하늘 120,000
2026-09-02 이바다 280,000
2026-09-03 김하늘 260,000

이 화면은 글의 구조를 보여주는 예시이며 실제 파일을 받거나 계산하지 않습니다.

예시 데이터로 구성된 CSV 업무 대시보드 완성 화면

입력과 결과를 이렇게 작게 잡아야 AI가 틀렸을 때 어디를 고칠지 보입니다. 처음부터 로그인, 데이터베이스, 예측 모델까지 한꺼번에 부탁하면 앱은 화려해지고 검산할 곳은 안개처럼 늘어납니다.

코딩보다 먼저 쓸 요구사항은 무엇일까요?

바이브코딩은 자연어로 AI 코딩 도구에 요구를 설명하고 결과를 고쳐 가는 방식입니다. 여기서 프롬프트는 주문서, CSV 형식은 납품 규격에 가깝습니다. “예쁘게 만들어 줘”보다 아래처럼 입력과 정답을 적어야 결과가 흔들리지 않습니다.

항목 이번 최소 기능 제품(MVP) 요구사항 확인 방법
입력 CSV 1개, 필수 열 날짜·담당자·매출 다른 확장자와 누락 열 거부
계산 총매출, 전체 행 수, 담당자별 매출 합계 엑셀 수동 합계와 비교
출력 지표 2개, 막대그래프, 원본 표 모든 값과 담당자 표시
오류 빈 파일, 인코딩, 숫자 변환 실패를 안내 오류용 CSV로 시험
개인정보 이름·전화번호·이메일 열 제거, 공개 배포 금지 기본값 화면·다운로드·로그 점검

Streamlit 공식 문서에서 st.file_uploader는 업로드 파일을 파일처럼 다룰 수 있고, 이를 pandas.read_csv에 바로 전달하는 예제를 제공합니다. st.metric, st.bar_chart, st.dataframe을 더하면 카드·차트·표라는 최소 대시보드가 만들어집니다.

2026년 9월 14일 확인 기준 Streamlit 공식 GitHub의 최신 릴리스는 1.63.0입니다. 공식 설치 문서는 Python 3.10~3.14를 지원 범위로 안내하므로, 버전이 다른 환경에서는 먼저 Python부터 확인하는 편이 낫습니다.

첫 프롬프트는 화면보다 규칙을 설명하세요

AI 코딩 도구에 다음 프롬프트를 그대로 붙여 넣고, 열 이름과 계산 규칙만 자기 업무에 맞게 바꿔 보세요.

Python과 Streamlit으로 단일 파일 app.py를 만들어 줘.
사용자는 CSV 파일 1개를 올린다.
필수 열은 날짜, 담당자, 매출이다.

요구사항:
- CSV가 없으면 안내문만 보인다.
- 필수 열이 빠지면 누락된 열 이름을 한국어로 보여주고 계산을 중단한다.
- 매출은 숫자로 변환하고, 변환할 수 없는 행 수를 경고한다.
- 정상 행만 사용해 총매출, 전체 정상 거래 건수, 담당자별 매출 합계를 계산한다.
- 결과는 st.metric 2개, st.bar_chart 1개, st.dataframe 1개로 표시한다.
- 원본 데이터에서 이름, 전화번호, 이메일 열은 제거한 뒤 화면에 전달한다.
- 예외를 숨기지 말고 사용자가 다음에 무엇을 고쳐야 하는지 알려 준다.
- 코드에 각 검증 단계의 이유를 짧은 주석으로 남긴다.

이 프롬프트의 핵심은 디자인 취향이 아니라 실패 조건입니다. AI가 코드를 빨리 만드는 것과 업무 규칙을 정확히 이해하는 것은 별개라서, 누락 열과 잘못된 숫자를 요구사항에 먼저 넣어야 합니다.

CSV 입력에서 AI 코딩과 검증된 대시보드 결과로 이어지는 사용 순서

문서 기반 최소 코드는 어떻게 생길까요?

아래 코드는 Streamlit 1.63.0과 pandas 3.0.5 공식 API를 기준으로 구성한 문서 기반 예제입니다. 이 글의 작업 환경에서는 앱 서버와 브라우저를 실제 구동하지 않았으므로 실행 후기나 성능 측정값으로 보시면 안 됩니다.

requirements.txt에는 재현할 버전을 적습니다.

streamlit==1.63.0
pandas==3.0.5

app.py는 입력 검증과 계산을 한 흐름에서 읽을 수 있게 작게 유지합니다.

import pandas as pd
import streamlit as st

REQUIRED = {"날짜", "담당자", "매출"}
SENSITIVE = {"이름", "전화번호", "이메일"}

st.title("CSV 업무 대시보드")
uploaded = st.file_uploader("CSV 파일을 올려 주세요", type="csv")

if uploaded is None:
    st.info("날짜, 담당자, 매출 열이 있는 CSV가 필요합니다.")
    st.stop()

try:
    df = pd.read_csv(uploaded)
except UnicodeDecodeError:
    st.error("파일 인코딩을 읽지 못했습니다. UTF-8 CSV로 다시 저장해 주세요.")
    st.stop()
except pd.errors.ParserError:
    st.error("CSV의 열 구분이나 따옴표 형식을 확인해 주세요.")
    st.stop()

missing = REQUIRED - set(df.columns)
if missing:
    st.error("필수 열이 없습니다: " + ", ".join(sorted(missing)))
    st.stop()

safe_df = df.drop(columns=[c for c in SENSITIVE if c in df.columns])
safe_df["매출"] = pd.to_numeric(safe_df["매출"], errors="coerce")
invalid_count = int(safe_df["매출"].isna().sum())

if invalid_count:
    st.warning(f"매출을 숫자로 바꿀 수 없는 {invalid_count}개 행은 계산에서 제외합니다.")

valid_df = safe_df.dropna(subset=["매출"])
if valid_df.empty:
    st.error("계산할 수 있는 매출 행이 없습니다.")
    st.stop()

by_owner = valid_df.groupby("담당자", as_index=False)["매출"].sum()

col1, col2 = st.columns(2)
col1.metric("총매출", f"{valid_df['매출'].sum():,.0f}원")
col2.metric("정상 거래 건수", f"{len(valid_df):,}건")

st.subheader("담당자별 매출")
st.bar_chart(by_owner, x="담당자", y="매출")

st.subheader("검증된 원본 데이터")
st.dataframe(valid_df, width="stretch", hide_index=True)

설치는 프로젝트별 가상환경에서 진행합니다. 공식 문서의 명령 흐름은 다음과 같습니다.

python -m venv .venv
source .venv/bin/activate  # macOS·Linux
pip install -r requirements.txt
streamlit run app.py

Windows의 가상환경 활성화 명령은 다릅니다. 설치가 막히면 운영체제용 명령을 AI에게 다시 묻기보다 Streamlit 공식 설치 문서와 현재 Python 버전을 함께 확인하세요.

수정 프롬프트는 한 번에 한 문제만 고치세요

앱이 열렸다면 색상부터 바꾸지 말고 정상 파일과 오류 파일을 먼저 넣어 봅니다. 문제가 생겼을 때는 오류 메시지, 기대 결과, 실제 결과를 한 묶음으로 전달해야 AI가 엉뚱한 부분을 덜 건드립니다.

현재 app.py에서 매출 값 "1,200"이 숫자로 변환되지 않는다.
기존 필수 열 검사와 개인정보 열 제거는 유지해 줘.
매출 열에서 쉼표와 앞뒤 공백만 제거한 뒤 숫자로 변환하도록 수정해 줘.
"1,200", " 3000 ", "미정"이 들어 있는 작은 테스트 데이터를 만들고,
앞의 두 값은 숫자가 되고 "미정"은 오류 행으로 집계되는지 pytest로 검증해 줘.
수정한 코드와 테스트 코드만 보여 줘.

“안 돼요, 고쳐 줘”만 보내면 AI는 원인을 추측해야 합니다. 수정 범위를 좁히고 유지할 동작까지 적어야, 이미 맞던 부분을 고치다가 새 오류를 만드는 일을 줄일 수 있습니다.

오류가 나면 어디부터 볼까요?

ModuleNotFoundError가 뜨면 앱을 실행한 Python과 패키지를 설치한 Python이 같은 가상환경인지 봅니다. python -m streamlit run app.py처럼 Python을 명시하면 환경이 엇갈렸는지 확인하기 쉽습니다.

한글 CSV에서 UnicodeDecodeError가 나면 파일 인코딩 문제일 가능성이 있습니다. 무작정 모든 인코딩을 차례로 시도하게 만들기보다, 업무 표준을 UTF-8로 정하거나 허용 인코딩과 실패 안내를 요구사항에 명시하세요.

합계가 맞지 않으면 차트보다 원본 행을 먼저 봅니다. 쉼표가 든 숫자, 빈 셀, 취소 거래, 중복 행을 어떤 규칙으로 처리할지 정하지 않았다면 코드는 실행돼도 보고서는 틀릴 수 있습니다.

검증 체크리스트는 실행 여부보다 정답을 봅니다

정상 파일 하나가 열리는 건 시작점입니다. 다음 표에서 업무 규칙과 실패 동작까지 통과해야 다른 사람에게 건넬 수 있습니다.

시험 데이터 기대 결과 통과 기준
정상 3행 합계 660,000원, 3건 엑셀 수동 계산과 일치
매출 열 없음 계산 중단 누락 열 이름 표시
매출=미정 1행 해당 행 제외 제외 건수 경고, 나머지 합계 일치
헤더만 있는 파일 계산 중단 계산 가능한 행이 없다는 안내
개인정보 열 포함 민감 열 제거 표·다운로드·로그 어디에도 노출되지 않음
큰 파일 허용 범위 안에서 처리 크기 제한과 실패 안내 확인

숫자만 맞춰 보지 말고 행 수, 필터 조건, 중복 처리, 반올림 규칙도 따로 비교하세요. Streamlit은 AppTest로 사용자 입력과 렌더링 결과를 브라우저 없이 검사하고 pytest와 함께 자동화할 수 있지만, 업무 담당자의 수동 정답표까지 대신 만들지는 않습니다.

배포 전에는 최소한 정상 파일, 누락 열 파일, 잘못된 숫자 파일을 테스트용으로 따로 보관하세요. 다음 수정 뒤에도 같은 파일을 다시 넣어야 “지난번에 되던 기능”이 조용히 망가지는 회귀를 찾을 수 있습니다.

개인정보가 든 CSV는 왜 더 조심해야 할까요?

파일 확장자를 CSV로 제한해도 안전이 보장되지는 않습니다. Streamlit 공식 문서도 파일 형식 제한은 최선 노력 검사이며, 올바른 파일 처리는 앱 개발자 책임이라고 설명합니다.

민감 열은 st.dataframe 옵션으로만 숨기지 마세요. 공식 문서에 따르면 표시 순서에서 빠진 열도 사용자가 표 도구 모음에서 다시 표시할 수 있으므로, 화면 함수에 넘기기 전에 DataFrame에서 제거해야 합니다. 데이터 내보내기와 로그도 함께 점검해야 합니다.

캐시도 주의할 부분입니다. st.cache_data의 기본 전역 캐시는 사용자와 세션을 가로질러 공유될 수 있으므로, 개인정보가 든 업로드 결과를 무심코 전역 캐시에 넣으면 안 됩니다. 이번 최소 코드가 캐시를 쓰지 않는 이유입니다.

사내 실데이터에는 고객명, 전화번호, 이메일, 주문번호처럼 다시 개인을 알아볼 수 있는 값이 섞일 수 있습니다. 처음에는 가짜 데이터로 개발하고, 외부 공개 배포 전에는 조직의 보안 담당자와 저장·전송·접근 권한 기준을 확인하는 편이 안전합니다.

이 방식이 잘 맞는 일과 아닌 일

같은 열 구조의 CSV가 반복되고 계산 규칙이 명확하다면 좋은 첫 과제입니다. 팀 내부 현황판, 캠페인별 집계, 재고 요약처럼 입력과 정답을 손으로 비교할 수 있는 업무가 특히 잘 맞습니다.

반대로 원본 형식이 매번 달라지거나, 여러 사람이 동시에 수정해야 하거나, 권한별 접근과 감사 기록이 필요한 업무라면 단일 Streamlit 파일로 끝내기 어렵습니다. 이때는 데이터베이스, 인증, 표준 데이터 파이프라인을 먼저 설계해야 합니다.

첫 버전의 목표는 멋진 차트가 아닙니다. CSV 한 장을 넣었을 때 같은 규칙으로 같은 답을 내고, 틀린 입력은 조용히 삼키지 않는 앱이면 충분합니다.

핵심 정리: 다섯 가지 질문과 답

Q. 바이브코딩을 시작할 때 가장 먼저 정할 것은 무엇인가요?

화면 색상이 아니라 입력 열, 계산식, 출력값, 실패 조건을 먼저 정합니다. 이 네 가지가 AI가 구현할 수 있는 요구사항의 뼈대입니다.

Q. 첫 Streamlit 대시보드에는 어떤 기능이면 충분한가요?

CSV 업로드, 핵심 지표, 범주별 차트, 검증된 원본 표부터 만듭니다. 로그인이나 예측 기능은 이 흐름이 검증된 뒤 별도 과제로 나누는 편이 낫습니다.

Q. 코드가 실행되면 검증도 끝난 건가요?

아닙니다. 정상 파일뿐 아니라 누락 열, 잘못된 숫자, 빈 파일을 넣고 기대 결과와 비교해야 합니다.

Q. 개인정보 열은 화면에서 숨기기만 하면 되나요?

아닙니다. 표 도구 모음에서 다시 노출될 수 있으므로 화면에 전달하기 전에 데이터에서 제거하고 다운로드와 로그도 점검해야 합니다.

Q. 이 방식이 맞지 않는 업무는 무엇인가요?

입력 형식이 자주 바뀌거나 복잡한 권한, 동시 수정, 감사 기록이 필요한 업무입니다. 이런 경우에는 단일 파일 앱보다 데이터와 접근 구조를 먼저 설계해야 합니다.

출처

  • Streamlit st.file_uploader: https://docs.streamlit.io/develop/api-reference/widgets/st.file_uploader
  • Streamlit st.dataframe: https://docs.streamlit.io/develop/api-reference/data/st.dataframe
  • Streamlit st.metric: https://docs.streamlit.io/develop/api-reference/data/st.metric
  • Streamlit st.bar_chart: https://docs.streamlit.io/develop/api-reference/charts/st.bar_chart
  • Streamlit st.cache_data: https://docs.streamlit.io/develop/api-reference/caching-and-state/st.cache_data
  • Streamlit 앱 테스트: https://docs.streamlit.io/develop/concepts/app-testing
  • Streamlit 설치: https://docs.streamlit.io/get-started/installation/command-line
  • Streamlit 1.63.0 릴리스: https://github.com/streamlit/streamlit/releases/tag/1.63.0
  • pandas read_csv: https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
  • pandas to_numeric: https://pandas.pydata.org/docs/reference/api/pandas.to_numeric.html
반응형

댓글