20

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)와 함께 검증해줘. 잘못된 부분이 있다면 교정해줘.
이 팁이 도움이 됐나요?