“웹 개발을 몰라도 괜찮다. Python만 알면 된다.”
데이터 분석가, 머신러닝 엔지니어라면 한 번쯤 이런 고민을 해봤을 것이다. 멋진 분석 결과를 동료나 고객에게 보여주고 싶은데, HTML·CSS·JavaScript를 배우기엔 시간이 없다. 이때 등장하는 해결책이 바로 Streamlit이다.
Streamlit이란?
Streamlit은 2019년에 등장한 오픈소스 Python 프레임워크다. 핵심 철학은 단순하다: “데이터 스크립트를 공유 가능한 웹 앱으로 빠르게 변환한다.” 프론트엔드 지식 없이도 슬라이더, 차트, 테이블, 파일 업로더가 포함된 인터랙티브 앱을 수십 분 내에 만들 수 있다.
2022년 Snowflake에 약 8억 달러에 인수되면서 엔터프라이즈 지원도 강화됐지만, 오픈소스 커뮤니티는 여전히 활발하게 운영 중이다.
설치와 첫 번째 앱
설치는 pip 한 줄로 끝난다.
pip install streamlit
다음 코드를 app.py로 저장한 뒤 실행해보자.
import streamlit as st
st.title("나의 첫 번째 Streamlit 앱 🎉")
st.write("안녕하세요! Streamlit으로 만든 첫 앱입니다.")
name = st.text_input("이름을 입력하세요")
if name:
st.success(f"환영합니다, {name}님!")
streamlit run app.py
브라우저가 자동으로 열리면서 http://localhost:8501에 앱이 실행된다. 코드를 수정하면 자동으로 새로고침되는 것도 눈여겨볼 포인트다.
핵심 개념: 실행 모델 이해하기
Streamlit을 처음 배울 때 가장 중요한 개념이 있다. 위젯의 값이 바뀔 때마다 스크립트 전체가 위에서 아래로 다시 실행된다. 이 단순한 규칙 덕분에 상태 관리가 직관적이다.
단, 무거운 연산이 반복 실행되는 것을 막기 위해 @st.cache_data 또는 @st.cache_resource 데코레이터를 사용한다.
@st.cache_data
def load_data(url):
# 처음 한 번만 실행되고 결과를 캐싱
return pd.read_csv(url)
주요 위젯 총정리
Streamlit이 제공하는 위젯은 매우 다양하다.
입력 위젯
import streamlit as st
# 텍스트
name = st.text_input("이름", placeholder="홍길동")
desc = st.text_area("설명", height=150)
# 숫자 / 범위
age = st.number_input("나이", min_value=0, max_value=120, value=25)
price_range = st.slider("가격 범위", 0, 100000, (10000, 50000))
# 선택
fruit = st.selectbox("과일 선택", ["사과", "바나나", "포도"])
colors = st.multiselect("색상 선택", ["빨강", "파랑", "초록"])
# 날짜 / 시간
date = st.date_input("날짜 선택")
time = st.time_input("시간 선택")
# 파일
uploaded = st.file_uploader("파일 업로드", type=["csv", "xlsx"])
# 토글 / 체크박스
dark = st.toggle("다크 모드")
agree = st.checkbox("약관에 동의합니다")
# 버튼
if st.button("제출"):
st.balloons()
출력 위젯
st.write("범용 출력 — 텍스트, 데이터프레임, 차트 모두 가능")
st.markdown("**마크다운** _지원_")
st.code("print('Hello')", language="python")
st.metric("오늘 방문자", 1234, delta=56)
st.image("photo.jpg", caption="예시 이미지")
st.dataframe(df, use_container_width=True)
st.table(df) # 정적 테이블
레이아웃 구성
앱이 복잡해지면 레이아웃이 필요하다.
# 사이드바
with st.sidebar:
st.header("설정")
model = st.selectbox("모델 선택", ["GPT-4", "Claude", "Gemini"])
# 컬럼 분할
col1, col2, col3 = st.columns([2, 1, 1])
with col1:
st.metric("매출", "₩12.4M", "+8%")
with col2:
st.metric("주문", "348건", "-3%")
with col3:
st.metric("고객", "1,204명", "+12%")
# 탭
tab1, tab2, tab3 = st.tabs(["개요", "상세 데이터", "설정"])
with tab1:
st.write("개요 내용")
# 확장 패널
with st.expander("고급 설정 보기"):
threshold = st.slider("임계값", 0.0, 1.0, 0.5)
세션 상태 관리
여러 번 실행 사이에 값을 유지하려면 st.session_state를 쓴다.
if "count" not in st.session_state:
st.session_state.count = 0
if st.button("카운트 증가"):
st.session_state.count += 1
st.write(f"현재 카운트: {st.session_state.count}")
실전 예제: 간단한 EDA 대시보드
import streamlit as st
import pandas as pd
import plotly.express as px
st.set_page_config(page_title="EDA 대시보드", layout="wide")
st.title("📊 데이터 탐색 대시보드")
# 파일 업로드
file = st.file_uploader("CSV 파일을 업로드하세요", type="csv")
if file:
df = pd.read_csv(file)
st.subheader("데이터 미리보기")
st.dataframe(df.head(10), use_container_width=True)
col1, col2 = st.columns(2)
with col1:
st.metric("행 수", len(df))
with col2:
st.metric("열 수", len(df.columns))
st.subheader("컬럼별 분포")
numeric_cols = df.select_dtypes(include="number").columns.tolist()
selected = st.selectbox("컬럼 선택", numeric_cols)
fig = px.histogram(df, x=selected, nbins=30, title=f"{selected} 분포")
st.plotly_chart(fig, use_container_width=True)
st.subheader("상관관계 히트맵")
fig2 = px.imshow(df[numeric_cols].corr(), text_auto=True, color_continuous_scale="RdBu_r")
st.plotly_chart(fig2, use_container_width=True)
멀티페이지 앱
앱이 커지면 페이지를 분리할 수 있다.
my_app/
├── Home.py ← 메인 진입점
└── pages/
├── 1_대시보드.py
├── 2_데이터_분석.py
└── 3_설정.py
pages/ 디렉터리에 파일을 추가하기만 하면 사이드바에 자동으로 네비게이션이 생성된다.
배포: Streamlit Community Cloud
만든 앱을 세상에 공개하는 것도 간단하다.
- 코드를 GitHub 저장소에 푸시한다.
- share.streamlit.io에 접속해 저장소를 연결한다.
- Deploy 버튼 클릭.
무료 플랜으로도 공개 앱을 배포할 수 있다. requirements.txt에 의존성을 명시해두는 것을 잊지 말자.
Streamlit의 한계
Streamlit이 만능은 아니다. 몇 가지 주의할 점이 있다.
- 실시간 협업에 약하다 — 여러 사용자가 동시에 사용하면 세션이 분리되어 각자 독립적으로 동작한다.
- 대규모 프로덕션 앱에는 부적합 — 복잡한 라우팅, 인증, 세밀한 CSS 커스터마이징이 필요하다면 FastAPI + React 조합을 고려해야 한다.
- 스크립트 재실행 비용 — 위젯 변경 시마다 전체 스크립트가 재실행되므로 캐싱 전략이 중요하다.
마무리
Streamlit은 데이터 분석 결과를 빠르게 공유하고 프로토타이핑하는 데 최적화된 도구다. 복잡한 웹 개발 지식 없이도 수 시간 만에 인상적인 앱을 만들 수 있다는 점이 가장 큰 강점이다. 데이터 사이언티스트라면 한 번쯤 꼭 써보길 권한다.