15분
Pitfall: Streamlit 개발 실수 5가지
프론트엔드 UI 개발 (Streamlit)
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 등 신기능으로 해결된 항목은 없는지 검증해줘.
이 팁이 도움이 됐나요?