앱이 커지면 코드가 복잡해지고 속도가 느려집니다. 기능 분리(Code Structure)와 캐싱(Caching)으로 성능을 최적화하는 방법을 알아봅시다.
1. 코드 구조화: common.py 분리하기
데이터를 로드하거나 전처리하는 무거운 함수들은 별도 파일(common.py)로 빼두는 것이 좋습니다. 그래야 메인 코드(app.py)가 깔끔해집니다.
파일 구조
- common.py: 데이터 생성 및 로드 담당
- app.py: 화면 구성 및 시각화 담당
2. 실행 속도 높이기: @st.cache_data
Streamlit은 버튼을 한 번 클릭할 때마다 코드를 처음부터 끝까지 다시 실행하는 특징이 있습니다. 데이터가 100만 건이라면 매번 다시 로딩하느라 엄청 느려지겠죠? 이때 "이 데이터는 변하지 않으니 기억해둬!"라고 명령하는 것이 바로 캐싱(Caching)입니다.
[Code] 최적화된 코드 예시
common.py (데이터 로드 전용)
import streamlit as st
import pandas as pd
import numpy as np
# @st.cache_data 데코레이터 추가! -> 이것이 속도 향상의 핵심
@st.cache_data
def get_medical_data():
# 데이터 생성에 5초가 걸린다고 가정하면,
# 첫 실행 때만 5초 걸리고, 두 번째부터는 0.001초 만에 불러옵니다!
print("데이터를 새로 생성합니다...") # 실행 확인용 로그
np.random.seed(42)
n = 1000 # 데이터가 커져도 캐싱 덕분에 빠름
df = pd.DataFrame({
'Patient_ID': range(1, n+1),
'Age': np.random.randint(30, 80, n),
'BMI': np.random.normal(25, 4, n).round(1),
'Blood_Pressure': np.random.randint(90, 160, n),
'Risk_Group': np.random.choice(['Low', 'Medium', 'High'], n)
})
return df
app.py (메인 화면)
import streamlit as st
from common import get_medical_data # 분리한 파일에서 함수 불러오기
st.title("고속 의료 데이터 분석기")
# 캐싱된 함수 호출
# 버튼을 아무리 눌러도 '데이터를 새로 생성합니다...' 로그가 뜨지 않습니다.
df = get_medical_data()
st.success("데이터 로드 완료! (캐싱 적용됨)")
st.write(f"총 환자 수: {len(df)}명")
# 이후 시각화 로직...

Tip:
- 모듈화 (common.py): 데이터 로딩 로직을 분리하면, 나중에 다른 분석 앱을 만들 때도 from common import get_medical_data만 하면 되니 재사용성이 높아집니다.
- 캐싱 (@st.cache_data): 의료 데이터는 용량이 큰 경우가 많습니다. 이 기능을 안 쓰면 필터 하나 바꿀 때마다 로딩을 기다려야 합니다. 꼭 사용하세요!
'Study Note > Streamlit' 카테고리의 다른 글
| AI 모델, 직접 만들어서 웹으로 배포하기 (A to Z) (1) | 2025.12.29 |
|---|---|
| "내 앱은 왜 자꾸 까먹을까?" : Session State와 Caching 완벽 해부 (0) | 2025.12.29 |
| 의료 데이터 분석, 웹으로 띄우기 (기초편) (0) | 2025.12.29 |
| 머신러닝 모델 연동: "재입원 확률, AI에게 물어보세요" (0) | 2025.12.29 |
| EDA 대시보드: 가상의 의료 데이터 생성 및 시각화 (0) | 2025.12.29 |