15

Pitfall: Streamlit 개발 실수 5가지

프론트엔드 UI 개발 (Streamlit)

학습 목표

Streamlit 특유의 함정을 미리 파악한다 각 실수에 대한 해결 패턴을 익힌다

Streamlit 개발 실수 5가지

실수 1: 매 실행마다 무거운 초기화

# [나쁜 예] 버튼 클릭할 때마다 모델 로딩
import chromadb
client = chromadb.PersistentClient("./data/chroma_db")  # 매번 로딩!

# [좋은 예] 캐시로 1회만 로딩
@st.cache_resource
def get_chroma_client():
    return chromadb.PersistentClient("./data/chroma_db")

client = get_chroma_client()  # 최초 1회만 실행

실수 2: 변수를 session_state에 저장 안 함

# [나쁜 예]
count = 0
if st.button("증가"):
    count += 1  # 다음 실행 시 다시 0!
st.write(count)  # 항상 0 또는 1

# [좋은 예]
if "count" not in st.session_state:
    st.session_state.count = 0
if st.button("증가"):
    st.session_state.count += 1
st.write(st.session_state.count)  # 누적됨

실수 3: 대용량 파일을 메모리에 유지

# [나쁜 예]
if uploaded := st.file_uploader("PDF"):
    content = uploaded.read()  # 전체 메모리 로딩
    st.session_state.file_content = content  # session_state에 큰 데이터!

# [좋은 예]
if uploaded := st.file_uploader("PDF"):
    # 파일을 디스크에 저장
    save_path = f"./data/documents/{uploaded.name}"
    with open(save_path, "wb") as f:
        f.write(uploaded.getbuffer())
    # session_state에는 경로만 저장
    st.session_state.last_upload = save_path

실수 4: rerun 루프

# [나쁜 예] 무한 rerun
if some_condition:
    do_something()
    st.rerun()  # do_something 후에도 조건이 True면 무한 루프!

# [좋은 예] 상태 변경 후 rerun
if st.session_state.get("need_refresh"):
    st.session_state.need_refresh = False  # 먼저 플래그 해제
    st.rerun()

실수 5: 채팅 이력을 LLM 형태로 저장

# [나쁜 예] LangChain 메시지 객체를 session_state에 저장
st.session_state.messages.append(HumanMessage(content="..."))
# -> 직렬화 문제 발생 가능

# [좋은 예] 단순 dict로 저장, 필요할 때 변환
st.session_state.messages.append(
    {"role": "user", "content": "..."}
)
AI로 학습하기 — 꿀팁
Streamlit session_state 함정 검증AI 학습 팁

Streamlit 개발 실수 목록에서 session_state 관련 설명이 최신 버전 동작과 일치하는지 확인하세요.

Streamlit 개발 시 흔한 실수로 '(1) session_state 미사용으로 상태 초기화, (2) 무거운 모델을 매번 로딩, (3) 동기 API 호출로 UI 블로킹'이 언급된다. 각 항목이 Streamlit 1.x 최신 버전에서도 동일하게 적용되는지, 혹시 st.cache_resource 등 신기능으로 해결된 항목은 없는지 검증해줘.
이 팁이 도움이 됐나요?