Session State

루까까·2025년 3월 16일

Streamlit

목록 보기
8/8

st.session_state사용자의 세션(앱이 실행되는 동안 유지되는 상태)을 저장하고 관리할 수 있는 키-값 저장소

📌 즉, 페이지를 새로고침하거나 앱을 재시작해도 유지되는 상태 관리 도구다.
일반적인 변수와 다르게 Streamlit의 리렌더링을 방지하면서 데이터를 유지할 수 있다!

1. st.session_state 기본 사용법

Streamlit에서는 딕셔너리(dict)처럼 st.session_state["key"] 형식으로 값을 저장하고 가져올 수 있다.

import streamlit as st

if "counter" not in st.session_state:
    st.session_state["counter"] = 0
    
if st.button("🔼 증가"):
    st.session_state["counter"] += 1

st.write(st.session_state['counter'])

사용자가 버튼을 클릭하면 counter가 오른다.

2. 그럼 왜 쓰냐?

Streamlit의 경우, 기본적으로 Python이 실행되는 것처럼 위에서 아래로 실행이 된다.

import streamlit as st

counter = 0
    
if st.button("🔼 증가"):
    counter += 1

st.write(counter)
  • counter를 0으로 하고 버튼을 누르면 counter 값이 오르도록 설정했지만, 버튼을 누를 때마다 코드가 다시 위에서부터 실행되면서 counter 값이 0으로 초기화된다.
    결국 counter 값은 0 또는 1만 나오게 된다.
  • st.session_state를 사용하면 버튼을 눌러도 값이 유지되면서 정상적으로 증가하게 된다.

즉, 사용자에 따라 인터렉트에따라 값이 유지되어야 한다면 session_state를 사용해야 한다.

3. 어떻게 쓰냐?

3-1. 값 읽기

value = st.session_state[key]
or
value = st.session_state.get(key)
  • 딕셔너리처럼 특정 키 값을 가져올 수 있음

3-2. 값 설정

st.session_state[key] = value
  • 세션 상태 값을 변경 가능

3-3. 값 삭제

st.session_state.__delattr__(key)
or
del st.session_state["counter"]
  • 특정 변수를 삭제 가능

3.4 전체 삭제

st.session_state.clear()
  • 모든 세션 변수 초기화

4. 실제 사용 사례

간단하게 사용할 수 있는 예시를 보자.

import streamlit as st

# session_state애 logged_in key값이 없으면 False라고 설정
if "logged_in" not in st.session_state:
    st.session_state["logged_in"] = False

# 로그인 버튼을 누르면 logged_in값 True
if st.button("로그인"):
    st.session_state["logged_in"] = True

# logged_in값이 True면 로그인 완료! 표시
if st.session_state["logged_in"]:
    st.success("로그인 완료!")

st.session_state 값 초기화 방법

if "logged_in" not in st.session_state:
    st.session_state["logged_in"] = False

해당 부분을 사용하는 이유는
st.session_state["logged_in"] = False로 설정하면
리렌더링될 때마다 logged_in 값이 다시 False로 초기화되기 때문이다.
그래서 최초 렌더링 시 if "logged_in" not in st.session_state:를 사용해
값이 설정되지 않았다면 초기값을 할당하는 방식으로 해결하는 것이다!

setdefault()를 활용한 코드 단축

위 코드를 한 줄로 줄일 수 있는 방법이 있다.
바로 st.session_state.setdefault(key, default)를 사용하는 것이다.

st.session_state.setdefault("logged_in", False)
  • ✅ 위와 같이 작성하면 st.session_state["logged_in"]가 없을 때만 False로 설정된다.
  • ✅ 기능은 동일하지만 코드가 더 깔끔해진다!

결론

  • st.session_state는 사용자 세션 데이터를 저장하고, 앱의 상태를 관리하는 강력한 도구
  • 페이지가 변경되거나 새로고침되어도 데이터 유지 가능
  • 다중 페이지 앱, 로그인 유지, UI 상태 저장 등에 활용 가능

즉, 페이지를 다시 로드해도 데이터가 사라지지 않게 하고 싶다!session_state 사용!

물론 완벽한 해결책은 아니다.
st.session_state는 사용자가 새로고침(F5) 을 하면 값이 초기화된다.
즉, session_state를 쿠키나 영구 저장소처럼 사용하려고 하면 문제가 발생할 수 있다.

profile
기타치는 개발자

0개의 댓글