Streamlit 완벽 가이드 — Python 한 줄로 데이터 앱 만들기




“웹 개발을 몰라도 괜찮다. 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

만든 앱을 세상에 공개하는 것도 간단하다.

  1. 코드를 GitHub 저장소에 푸시한다.
  2. share.streamlit.io에 접속해 저장소를 연결한다.
  3. Deploy 버튼 클릭.

무료 플랜으로도 공개 앱을 배포할 수 있다. requirements.txt에 의존성을 명시해두는 것을 잊지 말자.


Streamlit의 한계

Streamlit이 만능은 아니다. 몇 가지 주의할 점이 있다.

  • 실시간 협업에 약하다 — 여러 사용자가 동시에 사용하면 세션이 분리되어 각자 독립적으로 동작한다.
  • 대규모 프로덕션 앱에는 부적합 — 복잡한 라우팅, 인증, 세밀한 CSS 커스터마이징이 필요하다면 FastAPI + React 조합을 고려해야 한다.
  • 스크립트 재실행 비용 — 위젯 변경 시마다 전체 스크립트가 재실행되므로 캐싱 전략이 중요하다.

마무리

Streamlit은 데이터 분석 결과를 빠르게 공유하고 프로토타이핑하는 데 최적화된 도구다. 복잡한 웹 개발 지식 없이도 수 시간 만에 인상적인 앱을 만들 수 있다는 점이 가장 큰 강점이다. 데이터 사이언티스트라면 한 번쯤 꼭 써보길 권한다.




댓글 남기기