20분
Why: Streamlit의 실행 모델을 이해해야 하는 이유
프론트엔드 UI 개발 (Streamlit)
Why: Streamlit의 실행 모델을 이해해야 하는 이유
통합 프로젝트 > 프론트엔드 UI 개발 (Streamlit)
학습 목표
Streamlit의 "top-to-bottom re-run" 모델을 이해한다 session_state의 역할과 사용법을 안다 멀티페이지 앱 구조를 이해한다
Streamlit의 실행 모델
핵심: "매번 처음부터 다시 실행"
일반적인 웹 앱:
페이지 로드 (1회) -> 이벤트 발생 -> 핸들러 실행
Streamlit:
버튼 클릭 -> 전체 스크립트 처음부터 다시 실행
텍스트 입력 -> 전체 스크립트 처음부터 다시 실행
셀렉트 변경 -> 전체 스크립트 처음부터 다시 실행
이걸 이해하지 못하면 "왜 변수가 초기화되지?" 라는 함정에 빠진다.
session_state: 상태 유지의 열쇠
import streamlit as st
# [나쁜 예] 매번 초기화됨
messages = [] # 스크립트 재실행 시 빈 리스트로 초기화!
# [좋은 예] session_state에 저장
if "messages" not in st.session_state:
st.session_state.messages = [] # 최초 1회만 초기화
session_state 사용 패턴
# 초기화 패턴
def init_session_state():
"""session_state 초기화 (앱 시작 시 1회)"""
defaults = {
"messages": [], # 대화 이력
"agent": None, # Agent 인스턴스
"rag_service": None, # RAG 서비스
"kg_service": None, # KG 서비스
"uploaded_files": [], # 업로드된 파일 목록
"total_queries": 0, # 총 질문 수
"tool_usage": {}, # 도구 사용 통계
}
for key, default_value in defaults.items():
if key not in st.session_state:
st.session_state[key] = default_value
멀티페이지 구조
app/
├── main.py # 메인 진입점 (사이드바 + 초기화)
└── pages/
├── 1_Chat.py # /Chat
├── 2_Documents.py # /Documents
├── 3_KnowledgeGraph.py # /KnowledgeGraph
└── 4_Dashboard.py # /Dashboard
파일 이름의 숫자 접두사가 메뉴 순서를 결정한다.
중요: 서비스 초기화 위치
# [나쁜 예] 매 페이지마다 초기화
# pages/1_Chat.py
rag = RAGService(settings) # 매번 새로 생성!
agent = ManufacturingAgent(...) # 매번 새로 생성!
# [좋은 예] session_state에서 1회 초기화
# app/main.py
@st.cache_resource
def get_rag_service():
return RAGService(settings)
@st.cache_resource
def get_agent():
rag = get_rag_service()
kg = get_kg_service()
return ManufacturingAgent(settings, rag, kg)
@st.cache_resource: 앱 전체에서 1회만 생성, 공유
AI로 학습하기 — 꿀팁
✅Streamlit 재실행 모델 오해 검증AI 학습 팁
Streamlit의 top-to-bottom 재실행 모델에 대한 설명에서 session_state 역할이 정확히 기술되었는지 검증하세요.
Streamlit은 위젯 상호작용마다 스크립트 전체를 재실행한다고 배웠다. 'session_state에 저장하지 않은 변수는 매 재실행마다 초기화된다'는 설명이 정확한지, 예외 케이스(st.cache_data, st.cache_resource)와 함께 검증해줘. 잘못된 부분이 있다면 교정해줘.
이 팁이 도움이 됐나요?