🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

스트림릿 기초 완벽 가이드 - 슬라이드 1/8
A

AI Generated

2025. 12. 4. · 15 Views

스트림릿 기초 완벽 가이드

파이썬 개발자라면 누구나 쉽게 웹 앱을 만들 수 있는 스트림릿의 기초를 다룹니다. 설치부터 기본 출력, 앱 구조까지 차근차근 알아봅니다.


목차

  1. 스트림릿이란
  2. 스트림릿_설치하고_실행하기
  3. 기본_텍스트_출력하기
  4. 마크다운_출력하기
  5. 제목과_헤더_출력하기
  6. st_write_만능_출력_함수
  7. 스트림릿_앱_구조_이해

1. 스트림릿이란

김개발 씨는 데이터 분석 결과를 팀원들에게 공유해야 했습니다. 엑셀 파일을 이메일로 보내자니 뭔가 아쉽고, 웹 페이지로 만들자니 HTML, CSS, JavaScript를 새로 배워야 할 것 같았습니다.

그때 선배가 말했습니다. "스트림릿 써봤어요?

파이썬만 알면 웹 앱 뚝딱이에요."

**스트림릿(Streamlit)**은 파이썬 코드만으로 웹 애플리케이션을 만들 수 있는 오픈소스 프레임워크입니다. 마치 파이썬 스크립트를 실행하듯 웹 앱을 만들 수 있어서, 데이터 과학자와 백엔드 개발자들에게 큰 사랑을 받고 있습니다.

HTML이나 JavaScript를 전혀 몰라도 인터랙티브한 대시보드를 만들 수 있다는 점이 가장 큰 장점입니다.

다음 코드를 살펴봅시다.

# 가장 간단한 스트림릿 앱
import streamlit as st

# 제목을 표시합니다
st.title("안녕하세요, 스트림릿!")

# 텍스트를 출력합니다
st.write("파이썬으로 웹 앱을 만들어봅시다.")

# 버튼을 추가합니다
if st.button("클릭하세요"):
    st.write("버튼이 클릭되었습니다!")

김개발 씨는 입사한 지 6개월 된 데이터 분석가입니다. 매주 금요일마다 분석 결과를 팀에 공유해야 하는데, 항상 고민이 많았습니다.

주피터 노트북을 PDF로 변환해서 보내면 인터랙티브한 기능이 사라지고, 파워포인트로 만들자니 시간이 너무 오래 걸렸습니다. 어느 날, 선배 개발자 박시니어 씨가 김개발 씨의 고민을 듣고 말했습니다.

"스트림릿 한번 써볼래요? 파이썬만 알면 30분 안에 웹 대시보드 만들 수 있어요." 그렇다면 스트림릿이란 정확히 무엇일까요?

쉽게 비유하자면, 스트림릿은 마치 레고 블록과 같습니다. 레고 블록을 조립하듯 파이썬 함수들을 하나씩 쌓아 올리면 어느새 멋진 웹 애플리케이션이 완성됩니다.

복잡한 설계도나 전문 도구 없이도 누구나 쉽게 만들 수 있다는 점이 닮아있습니다. 스트림릿이 등장하기 전에는 어땠을까요?

데이터 과학자가 분석 결과를 웹으로 공유하려면 **플라스크(Flask)**나 장고(Django) 같은 웹 프레임워크를 배워야 했습니다. HTML로 화면을 구성하고, CSS로 스타일을 입히고, JavaScript로 동적 기능을 추가해야 했습니다.

데이터 분석 자체보다 웹 개발에 더 많은 시간을 쓰는 아이러니한 상황이 벌어졌습니다. 바로 이런 문제를 해결하기 위해 2019년 스트림릿이 세상에 나왔습니다.

스트림릿의 철학은 단순합니다. "파이썬 스크립트를 작성하듯 웹 앱을 만든다." st.title()로 제목을 넣고, st.write()로 텍스트를 출력하고, st.button()으로 버튼을 추가합니다.

정말 파이썬 함수를 호출하는 것처럼 직관적입니다. 위의 코드를 살펴보겠습니다.

먼저 import streamlit as st로 스트림릿을 불러옵니다. 관례적으로 st라는 별칭을 사용합니다.

그다음 **st.title()**로 웹 페이지의 제목을 설정합니다. 브라우저에서 크고 굵은 글씨로 표시됩니다.

**st.write()**는 텍스트를 화면에 출력하는 함수입니다. 마지막으로 **st.button()**은 클릭 가능한 버튼을 만들고, 클릭되면 True를 반환합니다.

실제 현업에서 스트림릿은 어떻게 활용될까요? 데이터 과학 팀에서 머신러닝 모델의 예측 결과를 실시간으로 보여주는 대시보드를 만들거나, 마케팅 팀에서 캠페인 성과를 한눈에 볼 수 있는 리포트를 제작할 때 많이 사용됩니다.

스타트업에서는 빠르게 프로토타입을 만들어 투자자에게 보여줄 때도 유용합니다. 스트림릿의 또 다른 장점은 핫 리로딩입니다.

코드를 수정하고 저장하면 브라우저가 자동으로 새로고침되어 변경 사항을 바로 확인할 수 있습니다. 개발 속도가 비약적으로 빨라집니다.

김개발 씨는 선배의 조언대로 스트림릿을 사용해봤습니다. 정말로 30분 만에 첫 번째 대시보드가 완성되었습니다.

"이렇게 쉬운 게 있었다니!" 김개발 씨는 감탄했습니다. 여러분도 파이썬을 알고 있다면, 오늘부터 스트림릿으로 웹 앱을 만들어볼 수 있습니다.

실전 팁

💡 - 스트림릿은 데이터 시각화와 머신러닝 프로토타이핑에 특히 강점이 있습니다

  • 파이썬 기본 문법만 알면 바로 시작할 수 있으니 부담 없이 도전해보세요

2. 스트림릿 설치하고 실행하기

박시니어 씨의 추천을 받은 김개발 씨는 당장 스트림릿을 설치해보기로 했습니다. 하지만 새로운 라이브러리를 설치할 때마다 느끼는 막연한 두려움이 있었습니다.

"혹시 복잡하면 어쩌지?" 다행히 스트림릿 설치는 놀라울 정도로 간단했습니다.

스트림릿은 pip 명령어 한 줄로 설치할 수 있습니다. 설치 후에는 streamlit run 명령어로 파이썬 파일을 실행하면 자동으로 브라우저에서 웹 앱이 열립니다.

별도의 서버 설정이나 복잡한 환경 구성 없이 바로 시작할 수 있다는 점이 스트림릿의 큰 매력입니다.

다음 코드를 살펴봅시다.

# 터미널에서 스트림릿 설치
# pip install streamlit

# app.py 파일 생성 후 아래 코드 작성
import streamlit as st

st.title("나의 첫 스트림릿 앱")
st.write("설치가 완료되었습니다!")

# 현재 스트림릿 버전 확인
st.write(f"Streamlit 버전: {st.__version__}")

# 터미널에서 실행: streamlit run app.py

김개발 씨는 터미널을 열고 설치 명령어를 입력했습니다. 새로운 도구를 설치할 때는 항상 설레면서도 긴장됩니다.

잘 설치될까? 버전 충돌은 없을까?

스트림릿 설치는 정말 간단합니다. 터미널에 pip install streamlit이라고 입력하면 끝입니다.

아나콘다를 사용한다면 conda install -c conda-forge streamlit으로도 설치할 수 있습니다. 설치가 완료되면 확인해볼 차례입니다.

터미널에 streamlit --version을 입력하면 설치된 버전이 표시됩니다. 버전 번호가 나타나면 설치가 성공한 것입니다.

2024년 기준으로 1.30 버전 이상이면 최신 기능들을 모두 사용할 수 있습니다. 이제 첫 번째 앱을 만들어봅시다.

텍스트 에디터를 열고 app.py라는 파일을 생성합니다. 위의 코드를 그대로 입력하고 저장합니다.

파일 이름은 자유롭게 정해도 되지만, 관례적으로 app.pymain.py를 많이 사용합니다. 실행 방법도 직관적입니다.

터미널에서 streamlit run app.py를 입력하면 마법이 일어납니다. 잠시 후 브라우저가 자동으로 열리면서 여러분이 만든 웹 앱이 나타납니다.

기본적으로 localhost:8501 주소에서 실행됩니다. 처음 실행하면 이메일 입력을 요청하는 화면이 나올 수 있습니다.

이것은 스트림릿 사용 통계를 위한 것으로, 입력해도 되고 그냥 엔터를 눌러 건너뛰어도 됩니다. 앱 실행에는 전혀 영향이 없습니다.

김개발 씨는 브라우저에 나타난 화면을 보고 감탄했습니다. "정말 코드 몇 줄로 웹 페이지가 만들어지네!" 스트림릿의 또 다른 편리한 점은 자동 새로고침 기능입니다.

코드를 수정하고 저장하면 브라우저 우측 상단에 "Rerun" 버튼이 나타납니다. 이 버튼을 클릭하거나, 설정에서 "Always rerun"을 선택하면 저장할 때마다 자동으로 앱이 업데이트됩니다.

개발 중에 앱을 중단하고 싶다면 터미널에서 Ctrl+C를 누르면 됩니다. 다시 실행하고 싶다면 같은 명령어를 입력하면 됩니다.

가상환경을 사용하는 것도 좋은 습관입니다. 프로젝트별로 venvconda 환경을 만들어서 스트림릿을 설치하면 다른 프로젝트와 충돌 없이 깔끔하게 관리할 수 있습니다.

김개발 씨는 첫 번째 앱 실행에 성공하고 자신감이 생겼습니다. 이제 본격적으로 스트림릿의 다양한 기능을 배워볼 차례입니다.

실전 팁

💡 - 가상환경에서 설치하면 프로젝트 관리가 훨씬 편리합니다

  • streamlit hello 명령어로 스트림릿의 다양한 데모를 바로 확인할 수 있습니다

3. 기본 텍스트 출력하기

웹 앱의 가장 기본은 텍스트를 화면에 보여주는 것입니다. 김개발 씨는 파이썬에서 print() 함수로 출력하듯이, 스트림릿에서는 어떻게 텍스트를 표시하는지 궁금해졌습니다.

알고 보니 더 다양하고 강력한 방법들이 있었습니다.

스트림릿에서 텍스트를 출력하는 가장 기본적인 함수는 **st.text()**입니다. 이 함수는 고정폭 폰트로 텍스트를 그대로 출력합니다.

파이썬의 print() 함수와 비슷하지만, 결과가 터미널이 아닌 웹 브라우저에 표시된다는 점이 다릅니다.

다음 코드를 살펴봅시다.

import streamlit as st

# 기본 텍스트 출력
st.text("안녕하세요, 스트림릿입니다.")

# 여러 줄 텍스트 출력
st.text("첫 번째 줄입니다.")
st.text("두 번째 줄입니다.")

# 변수를 활용한 텍스트 출력
name = "김개발"
st.text(f"환영합니다, {name}님!")

# 긴 텍스트도 그대로 출력됩니다
code_sample = "def hello(): return 'world'"
st.text(code_sample)

파이썬을 배울 때 가장 먼저 배우는 것이 print() 함수입니다. 화면에 "Hello, World!"를 출력하며 프로그래밍의 세계에 첫발을 딛게 되죠.

스트림릿에서도 비슷한 역할을 하는 함수가 있습니다. 바로 **st.text()**입니다.

김개발 씨는 처음에 혼란스러웠습니다. "스트림릿 코드 안에서 print()를 쓰면 안 되나요?" 물론 print()를 써도 에러가 나지는 않습니다.

하지만 print()의 출력은 터미널에만 표시되고, 웹 브라우저에는 나타나지 않습니다. 웹 앱 사용자에게 텍스트를 보여주려면 반드시 **st.text()**나 다른 스트림릿 출력 함수를 사용해야 합니다.

**st.text()**의 특징을 살펴보겠습니다. 이 함수는 **고정폭 폰트(monospace)**로 텍스트를 출력합니다.

고정폭 폰트란 모든 글자의 너비가 같은 폰트를 말합니다. 코드나 데이터를 표시할 때 정렬이 잘 맞아서 가독성이 좋습니다.

또한 st.text()는 텍스트를 있는 그대로 출력합니다. 마크다운 문법이나 HTML 태그를 해석하지 않고 문자 그대로 보여줍니다.

만약 별표(**)나 샵(#) 같은 특수 문자를 그대로 표시하고 싶다면 st.text()가 적합합니다. 위의 코드에서 f-string을 사용한 부분을 주목해주세요.

파이썬의 f-string 문법을 그대로 사용할 수 있습니다. 변수 값을 텍스트에 삽입할 때 매우 편리합니다.

name 변수에 "김개발"이 저장되어 있으면, 화면에는 "환영합니다, 김개발님!"이 표시됩니다. 그렇다면 st.text()는 언제 사용하면 좋을까요?

로그 메시지나 디버깅 정보를 표시할 때 유용합니다. 또한 코드 조각을 간단히 보여줄 때도 사용할 수 있습니다.

다만 긴 코드 블록을 표시할 때는 나중에 배울 st.code() 함수가 더 적합합니다. 주의할 점도 있습니다.

st.text()는 서식 없는 단순 텍스트만 출력합니다. 굵은 글씨, 기울임, 링크 같은 서식이 필요하다면 st.markdown() 함수를 사용해야 합니다.

각 함수의 용도를 알고 적재적소에 사용하는 것이 중요합니다. 김개발 씨는 st.text()의 단순함이 마음에 들었습니다.

복잡한 서식 없이 정보를 빠르게 표시할 때 딱이었습니다. 하지만 더 예쁜 텍스트를 출력하고 싶은 욕심도 생겼습니다.

다음 장에서는 마크다운을 활용해 더 풍성한 텍스트를 출력하는 방법을 알아보겠습니다.

실전 팁

💡 - st.text()는 마크다운을 해석하지 않으므로 특수 문자를 그대로 표시할 때 유용합니다

  • 디버깅용 출력에는 st.text()가, 사용자용 안내 문구에는 st.write()나 st.markdown()이 적합합니다

4. 마크다운 출력하기

김개발 씨는 텍스트를 출력하는 방법을 배웠지만, 뭔가 밋밋하다고 느꼈습니다. 굵은 글씨도 넣고 싶고, 목록도 만들고 싶고, 링크도 걸고 싶었습니다.

박시니어 씨가 말했습니다. "마크다운 문법 알아요?

그거 그대로 쓰면 돼요."

**st.markdown()**은 마크다운 문법을 해석해서 서식이 적용된 텍스트를 출력합니다. 마크다운은 간단한 기호로 문서의 서식을 지정하는 경량 마크업 언어입니다.

GitHub README나 노션에서 사용하는 그 문법 그대로 스트림릿에서도 사용할 수 있습니다.

다음 코드를 살펴봅시다.

import streamlit as st

# 기본 마크다운 출력
st.markdown("**굵은 글씨**와 *기울임 글씨*를 사용할 수 있습니다.")

# 목록 만들기
st.markdown("""
### 오늘의 할 일
- 스트림릿 공부하기
- 대시보드 만들기
- 팀에 공유하기
""")

# 링크 추가
st.markdown("[스트림릿 공식 문서](https://docs.streamlit.io)")

# 인라인 코드
st.markdown("변수를 출력하려면 `st.write()`를 사용하세요.")

마크다운이라는 단어가 낯설게 느껴질 수도 있습니다. 하지만 GitHub에서 README 파일을 작성해본 적이 있다면, 이미 마크다운을 사용해본 것입니다.

노션이나 슬랙에서 글을 꾸밀 때 쓰는 문법도 마크다운과 비슷합니다. 마크다운의 핵심은 간단한 기호로 서식을 지정한다는 것입니다.

별표 두 개로 감싸면 굵은 글씨, 별표 하나로 감싸면 기울임 글씨, 대시(-)로 시작하면 목록이 됩니다. 복잡한 HTML 태그를 외울 필요 없이 직관적인 기호만 기억하면 됩니다.

김개발 씨는 마크다운의 편리함에 감탄했습니다. "이렇게 쉽게 서식을 넣을 수 있다니!" st.markdown() 함수는 문자열 안의 마크다운 문법을 해석해서 예쁘게 렌더링합니다.

샵(#) 기호로 제목을 만들 수 있고, 대시(-)나 별표(*)로 목록을 만들 수 있습니다. 대괄호와 소괄호를 조합하면 클릭 가능한 링크도 만들어집니다.

위의 코드에서 삼중 따옴표(""")를 사용한 부분을 살펴보세요. 파이썬의 멀티라인 문자열을 활용하면 여러 줄에 걸친 마크다운을 깔끔하게 작성할 수 있습니다.

목록이나 긴 텍스트를 작성할 때 특히 유용합니다. 인라인 코드 표시도 자주 사용되는 기능입니다.

백틱(`) 하나로 감싸면 인라인 코드가 됩니다. 함수 이름이나 변수명을 본문 중에 언급할 때 가독성을 높여줍니다.

백틱 세 개로 감싸면 코드 블록이 되지만, 코드 블록은 나중에 배울 st.code() 함수를 사용하는 것이 더 좋습니다. 스트림릿의 마크다운은 몇 가지 확장 기능도 지원합니다.

unsafe_allow_html=True 옵션을 추가하면 HTML 태그도 사용할 수 있습니다. 예를 들어 글자 색상을 바꾸거나 더 복잡한 레이아웃을 만들 때 활용할 수 있습니다.

다만 이름에서 알 수 있듯이 보안상 주의가 필요한 옵션이므로, 신뢰할 수 있는 콘텐츠에만 사용해야 합니다. 실무에서 마크다운은 어떻게 활용될까요?

대시보드의 설명 문구, 분석 결과에 대한 해설, 사용자 가이드 등을 작성할 때 마크다운을 활용합니다. 서식이 적용되면 정보 전달력이 훨씬 높아집니다.

밋밋한 텍스트 나열보다 구조화된 문서가 읽기 편하기 때문입니다. 김개발 씨는 자신의 앱에 마크다운을 적용해봤습니다.

같은 내용인데도 훨씬 전문적으로 보였습니다. 작은 차이가 큰 인상을 만든다는 것을 깨달았습니다.

실전 팁

💡 - 마크다운 문법이 익숙하지 않다면 노션이나 GitHub에서 먼저 연습해보세요

  • unsafe_allow_html 옵션은 보안상 꼭 필요한 경우에만 사용하세요

5. 제목과 헤더 출력하기

김개발 씨는 대시보드에 큰 제목을 넣고 싶었습니다. st.markdown("# 제목")으로 해도 되지만, 뭔가 더 직관적인 방법이 있을 것 같았습니다.

찾아보니 스트림릿은 제목과 헤더를 위한 전용 함수를 제공하고 있었습니다.

스트림릿은 st.title(), st.header(), st.subheader(), st.caption() 등 제목 수준별 전용 함수를 제공합니다. 각 함수는 서로 다른 크기와 스타일로 텍스트를 표시합니다.

마크다운의 # 기호 대신 이 함수들을 사용하면 코드의 가독성이 높아지고 의도가 더 명확해집니다.

다음 코드를 살펴봅시다.

import streamlit as st

# 페이지 최상단 제목
st.title("판매 현황 대시보드")

# 섹션 제목
st.header("월별 매출 분석")

# 소제목
st.subheader("2024년 1월 리포트")

# 작은 캡션 (회색 작은 글씨)
st.caption("마지막 업데이트: 2024년 1월 15일")

# 구분선 추가
st.divider()

# 다음 섹션
st.header("고객 분석")

잘 구조화된 문서는 읽기 편합니다. 신문 기사를 생각해보세요.

큰 제목으로 핵심 내용을 전달하고, 중간 제목으로 섹션을 나누고, 본문에서 세부 내용을 설명합니다. 웹 대시보드도 마찬가지입니다.

스트림릿은 이런 문서 구조를 쉽게 만들 수 있도록 계층별 제목 함수를 제공합니다. 가장 큰 제목은 **st.title()**입니다.

페이지 최상단에 한 번만 사용하는 것이 좋습니다. 마치 책의 제목처럼 전체 페이지가 무엇에 관한 것인지 알려주는 역할을 합니다.

그다음 크기는 **st.header()**입니다. 대시보드를 여러 섹션으로 나눌 때 사용합니다.

"매출 분석", "고객 분석", "재고 현황"처럼 큰 카테고리를 구분하는 데 적합합니다. **st.subheader()**는 header보다 한 단계 작은 제목입니다.

섹션 안에서 세부 주제를 나눌 때 사용합니다. 예를 들어 "매출 분석" 섹션 안에 "월별 추이", "제품별 현황" 같은 소제목을 붙일 때 유용합니다.

**st.caption()**은 조금 특별합니다. 회색의 작은 글씨로 표시되어, 부가 정보나 주석을 달 때 사용합니다.

데이터의 출처, 마지막 업데이트 시간, 주의사항 같은 내용을 표시하기에 알맞습니다. 위의 코드에서 **st.divider()**도 주목해주세요.

이 함수는 가로 구분선을 그립니다. 섹션과 섹션 사이를 시각적으로 분리할 때 유용합니다.

마크다운의 --- 와 같은 역할을 합니다. 그런데 st.markdown("# 제목")을 써도 같은 결과가 나오는데, 왜 전용 함수를 쓸까요?

첫째, 코드 가독성이 좋아집니다. st.title()이라고 쓰면 누가 봐도 제목을 출력하는 코드라는 것을 알 수 있습니다.

둘째, 스타일 일관성이 보장됩니다. 스트림릿이 정해둔 스타일로 표시되므로 페이지 전체가 통일감 있어 보입니다.

셋째, IDE 자동완성 지원이 됩니다. st.까지 입력하면 사용 가능한 함수 목록이 나타나서 개발이 편해집니다.

김개발 씨는 자신의 대시보드에 제목 계층을 적용했습니다. 한눈에 구조가 파악되니 훨씬 전문적으로 보였습니다.

작은 변화가 큰 차이를 만든다는 것을 다시 한번 느꼈습니다.

실전 팁

💡 - st.title()은 페이지당 한 번만 사용하고, 나머지는 header와 subheader로 구조화하세요

  • st.caption()은 데이터 출처나 업데이트 시간을 표시하는 데 유용합니다

6. st write 만능 출력 함수

김개발 씨는 여러 출력 함수를 배우면서 조금 혼란스러워졌습니다. 텍스트는 st.text(), 마크다운은 st.markdown(), 제목은 st.title()...

기억해야 할 게 너무 많았습니다. 그때 박시니어 씨가 말했습니다.

"사실 st.write() 하나면 웬만한 건 다 돼요."

**st.write()**는 스트림릿의 만능 출력 함수입니다. 텍스트, 숫자, 데이터프레임, 차트, 딕셔너리 등 거의 모든 파이썬 객체를 자동으로 감지해서 적절한 형태로 출력합니다.

무엇을 넘기든 알아서 예쁘게 표시해주는 똑똑한 함수입니다.

다음 코드를 살펴봅시다.

import streamlit as st
import pandas as pd

# 텍스트 출력 (마크다운 지원)
st.write("**안녕하세요!** 스트림릿 세계에 오신 것을 환영합니다.")

# 숫자 출력
st.write(42)
st.write(3.14159)

# 리스트와 딕셔너리 출력
st.write(["사과", "바나나", "체리"])
st.write({"이름": "김개발", "나이": 28})

# 데이터프레임 출력
df = pd.DataFrame({
    "제품": ["노트북", "마우스", "키보드"],
    "가격": [1200000, 35000, 89000]
})
st.write(df)

프로그래밍을 하다 보면 "만능" 도구가 있으면 좋겠다는 생각이 들 때가 있습니다. 스트림릿의 **st.write()**가 바로 그런 도구입니다.

마치 스위스 아미 나이프처럼 하나로 여러 가지 일을 할 수 있습니다. **st.write()**의 작동 원리는 이렇습니다.

이 함수는 전달받은 인자의 타입을 자동으로 감지합니다. 문자열이 들어오면 마크다운으로 렌더링하고, 숫자가 들어오면 숫자 그대로 표시하고, 판다스 데이터프레임이 들어오면 예쁜 테이블로 표시합니다.

개발자가 타입별로 다른 함수를 호출할 필요가 없습니다. 김개발 씨는 이 함수를 발견하고 기뻤습니다.

"하나만 기억하면 되니까 훨씬 편하네요!" 위의 코드를 살펴보겠습니다. 문자열을 전달하면 마크다운이 자동 적용됩니다.

별표로 감싼 부분은 굵은 글씨로 표시됩니다. st.markdown()을 명시적으로 호출하지 않아도 됩니다.

숫자를 전달하면 숫자가 그대로 출력됩니다. 리스트나 딕셔너리를 전달하면 보기 좋게 포맷팅되어 표시됩니다.

JSON 뷰어처럼 접고 펼 수 있는 형태로 나타나기도 합니다. 가장 인상적인 것은 데이터프레임 출력입니다.

판다스 DataFrame 객체를 st.write()에 전달하면, 정렬 가능하고 스크롤 가능한 인터랙티브 테이블로 변환됩니다. 컬럼 헤더를 클릭하면 정렬되고, 데이터가 많으면 자동으로 스크롤바가 생깁니다.

하지만 st.write()가 항상 최선은 아닙니다. 특정 형태로 출력해야 할 때는 전용 함수가 더 적합합니다.

예를 들어 데이터프레임을 더 세밀하게 제어하고 싶다면 **st.dataframe()**이나 **st.table()**을 사용하는 것이 좋습니다. 코드 블록을 문법 강조와 함께 표시하고 싶다면 **st.code()**를 사용해야 합니다.

그럼 언제 st.write()를 쓰고 언제 전용 함수를 쓸까요? 빠른 프로토타이핑이나 디버깅 중에는 st.write()가 편리합니다.

출력 형태를 고민할 필요 없이 일단 화면에 뿌려볼 수 있으니까요. 하지만 최종 결과물에서는 전용 함수를 사용해서 의도를 명확히 하는 것이 좋습니다.

박시니어 씨가 덧붙였습니다. "st.write()는 스트림릿을 처음 배울 때 친구 같은 함수예요.

나중에 익숙해지면 상황에 맞는 전용 함수를 쓰게 될 거예요." 김개발 씨는 고개를 끄덕였습니다. 일단 st.write()로 시작하고, 점점 전문가의 길로 나아가면 되는 것이었습니다.

실전 팁

💡 - 빠른 프로토타이핑에는 st.write()가 편리하지만, 최종 결과물에서는 전용 함수를 사용하세요

  • st.write()는 여러 인자를 한 번에 받을 수 있습니다: st.write("값:", 42)

7. 스트림릿 앱 구조 이해

김개발 씨는 스트림릿의 여러 출력 함수를 배웠지만, 한 가지 의문이 생겼습니다. "코드를 위에서 아래로 쭉 쓰면 그게 곧 앱이 되는 건가요?" 이 질문에 대한 답을 이해하면 스트림릿의 본질을 파악한 것이나 다름없습니다.

스트림릿 앱은 위에서 아래로 순차적으로 실행되는 파이썬 스크립트입니다. 사용자가 버튼을 클릭하거나 입력값을 변경하면 전체 스크립트가 처음부터 다시 실행됩니다.

이것이 스트림릿의 핵심 개념인 재실행(rerun) 모델입니다. 이 구조를 이해하면 효율적인 앱을 설계할 수 있습니다.

다음 코드를 살펴봅시다.

import streamlit as st

# 1. 페이지 설정 (항상 가장 먼저)
st.set_page_config(
    page_title="나의 대시보드",
    page_icon="📊",
    layout="wide"
)

# 2. 제목 영역
st.title("판매 현황 대시보드")

# 3. 사이드바 영역
with st.sidebar:
    st.header("설정")
    option = st.selectbox("기간 선택", ["일간", "주간", "월간"])

# 4. 메인 콘텐츠 영역
st.header(f"{option} 리포트")
st.write("선택한 기간에 따른 데이터가 여기에 표시됩니다.")

# 5. 하단 정보
st.divider()
st.caption("문의: dashboard@company.com")

전통적인 웹 개발에서는 HTML로 구조를 만들고, CSS로 스타일을 입히고, JavaScript로 동적 기능을 추가합니다. 프론트엔드와 백엔드가 분리되어 있고, 복잡한 상태 관리가 필요합니다.

스트림릿은 이 모든 것을 단순화했습니다. 스트림릿의 철학은 명쾌합니다.

"파이썬 스크립트가 곧 앱이다." 코드를 위에서 아래로 작성하면, 그 순서대로 화면에 요소들이 배치됩니다. st.title()을 먼저 쓰면 제목이 위에, st.write()를 나중에 쓰면 텍스트가 아래에 나타납니다.

HTML 레이아웃을 고민할 필요가 없습니다. 하지만 가장 중요한 개념은 재실행(rerun) 모델입니다.

사용자가 버튼을 클릭하거나, 슬라이더를 움직이거나, 텍스트를 입력하면 어떤 일이 벌어질까요? 스트림릿은 전체 파이썬 스크립트를 처음부터 다시 실행합니다.

변경된 부분만 업데이트하는 것이 아니라, 파일 전체를 다시 돌립니다. 김개발 씨는 처음에 이것이 비효율적으로 느껴졌습니다.

"매번 전체를 다시 실행한다고요?" 하지만 이 방식에는 큰 장점이 있습니다. 상태 관리가 단순해집니다. 복잡한 이벤트 핸들러나 콜백 함수를 작성할 필요가 없습니다.

변수 값이 바뀌면 자연스럽게 화면도 업데이트됩니다. 위의 코드에서 구조를 살펴보겠습니다.

**st.set_page_config()**는 항상 맨 처음에 와야 합니다. 페이지 제목, 아이콘, 레이아웃 등 전역 설정을 담당합니다.

이 함수 전에 다른 스트림릿 함수를 호출하면 에러가 발생합니다. 사이드바st.sidebar를 통해 만듭니다.

with 문을 사용하면 그 안의 모든 요소가 사이드바에 배치됩니다. 필터나 설정 옵션을 넣기에 적합한 공간입니다.

메인 영역은 사이드바를 제외한 중앙 부분입니다. 대부분의 콘텐츠가 여기에 표시됩니다.

재실행 모델의 함정도 알아두어야 합니다. 스크립트가 매번 재실행되므로, 무거운 연산이나 데이터 로딩이 매번 일어나면 앱이 느려집니다.

이 문제를 해결하기 위해 스트림릿은 @st.cache_data 같은 캐싱 기능을 제공합니다. 자주 쓰는 데이터는 캐시해두면 재실행되어도 빠르게 로드됩니다.

김개발 씨는 이제 스트림릿의 큰 그림이 그려졌습니다. 위에서 아래로 코드를 쓰고, 사용자 상호작용이 있으면 전체가 재실행된다.

이 단순한 모델 위에 모든 기능이 동작한다는 것을 이해했습니다. 박시니어 씨가 마무리했습니다.

"이제 기초는 끝났어요. 다음에는 버튼, 입력 폼, 차트 같은 인터랙티브 요소를 배워보죠." 김개발 씨는 설레는 마음으로 다음 단계를 기다렸습니다.

실전 팁

💡 - st.set_page_config()는 반드시 다른 스트림릿 함수보다 먼저 호출해야 합니다

  • 무거운 연산은 @st.cache_data 데코레이터로 캐싱하여 성능을 개선하세요

이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!

#Streamlit#Python#WebApp#DataScience#Dashboard#Python,Streamlit,UI

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.