오늘의 학습
오늘은 Streamlit을 이용해 사용자의 입력 상태를 관리하는 방법(Session State)과 Form을 활용한 입력 처리 방식을 중심으로 학습했다. 이전까지는 버튼을 누를 때마다 화면이 새로고침되면서 입력했던 내용이 사라지는 것이 당연한 줄 알았는데, Session State를 사용하면 사용자가 입력한 값을 계속 유지할 수 있다는 점을 직접 실습을 통해 이해할 수 있었다.
또한 단순한 예제를 그대로 따라 하는 것이 아니라, 피자 주문 예제를 응용하여 'AI 레슨 커리큘럼' 프로그램으로 새롭게 구현해 보았다. 기존에 만들었던 레슨 관리 대시보드도 월별 데이터와 수익 분석 기능을 추가하면서 조금 더 실제 관리자 페이지에 가까운 형태로 발전시킬 수 있었다.
주요 학습 내용
Session State로 사용자 입력 상태 유지하기
오늘 가장 중요한 개념은 Session State였다.
Streamlit은 버튼을 누르거나 입력값이 변경될 때마다 코드가 처음부터 다시 실행되는 구조다. 그래서 일반 변수만 사용하면 입력했던 내용이 모두 초기화된다.
이 문제를 해결하기 위해 st.session_state를 사용했다.
이번 실습에서는 Session State에
- 수강생 이름
- 레슨 유형
- 레슨 목표
- 레슨 시간
- 시간당 레슨비
- 예상 수강 기간
- 커리큘럼
- 준비물
- 추가 요청사항
등을 저장하도록 구현했다.
또한 초기 실행 시 필요한 값을 등록하는 init_state() 함수와 입력 내용을 한 번에 초기화하는 clear_state() 함수도 만들어 Session State를 조금 더 체계적으로 사용할 수 있었다.
이번 실습을 통해 Session State는 단순한 변수 저장 기능이 아니라 사용자의 작업 상태를 유지하기 위한 핵심 기능이라는 점을 이해하게 되었다.
Form을 이용한 신청서 만들기
이번에는 st.form()도 함께 활용했다.
Form 안에서는 여러 입력값을 받은 뒤 제출 버튼을 눌렀을 때 한 번에 처리할 수 있기 때문에 실제 서비스에서 많이 사용하는 방식이라고 느꼈다.
직접 만든 신청서에는
- 수강생 이름
- 레슨 목표
- 주간 레슨 시간
- 시간당 레슨비
- 예상 수강 기간
- 커리큘럼
- 준비물
- 추가 요청사항
등을 입력하도록 구성했다.
제출 버튼을 누르면 입력한 내용을 한 번에 출력하도록 만들었고, 초기화 버튼을 누르면 Session State에 저장된 값까지 모두 초기 상태로 되돌리도록 구현했다.
또한 수강생 이름이나 레슨 유형처럼 반드시 입력해야 하는 값은 조건문으로 검사하여 누락되었을 경우 오류 메시지를 출력하도록 구현했다.
버튼을 활용한 AI 레슨 커리큘럼 프로그램 만들기
오늘 과제는 제공된 피자 주문 예제를 그대로 사용하는 대신, 직접 아이디어를 바꿔 AI 레슨 커리큘럼 프로그램으로 구현했다.
사용자가 버튼을 클릭하면 해당 레슨에 맞는 기본 커리큘럼이 자동으로 입력되도록 구성했다.
준비한 레슨 유형은 다음과 같다.
- 취미 랩 레슨
- 자작곡 레슨
- 작곡 레슨
- 믹싱·마스터링 레슨
각 버튼에는 on_click을 사용하여 각각의 프리셋 함수가 실행되도록 만들었다.
예를 들어 취미 랩 레슨 버튼을 누르면
- 수강 목표
- 추천 커리큘럼
- 준비물
- 예상 수강 기간
- 시간당 레슨비
등이 자동으로 입력된다.
자작곡 레슨은 작사와 곡 구성 중심으로, 작곡 레슨은 코드 진행과 멜로디 중심으로, 믹싱·마스터링 레슨은 EQ와 컴프레서, 마스터링 기초 중심으로 각각 다른 프리셋을 구성하였다.
실제로 AI를 사용하는 것은 아니지만, 버튼별로 미리 준비한 데이터를 자동으로 불러와 사용자에게 맞는 커리큘럼을 추천하는 형태로 구현하였다.
예상 레슨비 자동 계산
레슨 정보를 입력받은 뒤에는 예상 레슨비도 자동으로 계산하도록 만들었다.
사용자가
- 주간 레슨 시간
- 시간당 레슨비
를 입력하면
주간 레슨 시간 × 시간당 레슨비 × 4주
를 계산하여 예상 월 레슨비를 자동으로 출력하도록 구현하였다.
또한 최종 결과 화면에서는
- 수강생 이름
- 주간 레슨 시간
- 시간당 레슨비
- 예상 월 레슨비
를 Metric으로 표시하여 한눈에 확인할 수 있도록 구성하였다.
레슨 관리 대시보드 기능 확장
이전에 만들었던 레슨 관리 대시보드도 계속 개선했다.
기존에는 학생 목록만 관리했다면 이번에는 별도의 월별 데이터를 추가하여
- 학생별 월간 레슨 시간
- 시간당 레슨비
- 월별 레슨 수익
을 계산하도록 수정하였다.
또한 학생별 데이터를 DataFrame으로 관리하고 월별 데이터를 추가로 생성하여 두 데이터를 활용할 수 있도록 구조를 개선하였다.
데이터 시각화 추가
월별 데이터를 만들면서 단순히 표만 출력하지 않고 차트도 추가했다.
이번에 구현한 기능은
- 월별 총 레슨 시간
- 월별 총 수익
- 학생별 월간 레슨 시간 비교
- 학생별 월간 수익 비교
등이었다.
또한 사이드바에서 월을 선택하면 해당 월 데이터만 확인할 수 있도록 필터도 추가했다.
이전에는 Streamlit이 단순히 화면을 만드는 도구라고 생각했는데, 데이터를 분석하고 시각화하는 관리자 페이지도 충분히 만들 수 있다는 점을 알게 되었다.
Streamlit 화면 구성
이번 실습에서는 화면 구성도 조금 더 신경 써 보았다.
st.columns()를 이용하여 버튼을 가로로 배치하고,
상단에는
- 핵심 지표(Metric)
중간에는
- 학생 목록
- 통계
- 피드백
탭을 배치하였다.
추가로
- 월별 레슨·수익
탭도 만들어 관리자 페이지처럼 데이터를 관리할 수 있도록 구성하였다.
단순히 기능을 구현하는 것뿐 아니라 사용하기 편한 화면 구성을 고민해 볼 수 있었던 점도 좋은 경험이었다.
Git 브랜치를 활용한 과제 관리
과제는 개인 브랜치인 jso에서 작업하였다.
작업이 완료된 뒤에는
- git add
- git commit
- git push
순서대로 진행하며 브랜치 단위로 과제를 관리하는 방법도 다시 복습했다.
커밋 메시지는 기능을 쉽게 알아볼 수 있도록
feat: 레슨 커리큘럼 Streamlit 앱 추가
형태로 작성하면서 Git 커밋 컨벤션도 함께 익힐 수 있었다.
실습 및 문제 해결
오늘 가장 어려웠던 부분은 Session State의 동작 방식이었다.
처음에는 버튼을 누를 때마다 입력한 내용이 계속 사라져 왜 그런지 이해하지 못했지만, Session State에 값을 저장하는 구조를 적용한 뒤에는 입력값이 정상적으로 유지되는 것을 확인할 수 있었다.
또한 여러 레슨 유형마다 다른 데이터를 자동으로 입력하도록 구현하면서 프리셋 함수를 어떻게 분리하면 관리하기 쉬운지도 고민해 볼 수 있었다.
기존 레슨 관리 프로그램도 단순한 목록 출력에서 끝나는 것이 아니라 월별 데이터와 수익 분석 기능까지 추가하면서 점점 실제 서비스 형태로 발전하는 모습을 볼 수 있어 재미있었다.
오늘의 회고
오늘은 Streamlit을 조금 더 깊게 이해한 하루였다.
처음에는 버튼을 누르면 화면이 새로고침되는 것이 불편하게만 느껴졌지만, Session State를 사용하면 그 문제를 해결할 수 있다는 점을 직접 구현하면서 이해할 수 있었다.
또한 예제를 그대로 따라 하는 것이 아니라 피자 주문 프로그램을 내 관심 분야인 랩 레슨으로 바꾸어 구현해 보니 같은 기능이라도 훨씬 재미있게 느껴졌다. 레슨 유형에 따라 커리큘럼이 자동으로 입력되고 예상 레슨비까지 계산되는 프로그램을 만들면서 실제 상담 프로그램으로도 응용할 수 있겠다는 생각이 들었다.
기존 레슨 관리 대시보드도 계속 개선하면서 학생 관리뿐 아니라 월별 레슨 시간과 수익까지 확인할 수 있는 관리자 페이지 형태로 발전시킬 수 있었다.
아직은 메모리에만 데이터를 저장하지만 앞으로는 데이터베이스와 연동하여 실제 예약 관리나 학생 관리 시스템으로 확장해 보고 싶다.
오늘은 단순히 Streamlit 문법을 배우는 것이 아니라 실제 서비스를 어떻게 구성하는지 조금씩 감을 잡기 시작한 하루였던 것 같다.
핵심 정리
- Session State를 이용하여 사용자 입력 상태를 유지하는 방법을 학습했다.
- Form을 활용해 여러 입력값을 한 번에 처리하는 신청서를 구현했다.
- 버튼별 프리셋을 활용한 AI 레슨 커리큘럼 프로그램을 직접 제작했다.
- 월별 레슨 시간과 수익 데이터를 계산하고 차트로 시각화했다.
- 기존 레슨 관리 대시보드를 관리자 페이지 형태로 개선했다.
- Git 브랜치를 활용하여 과제를 관리하고 커밋 컨벤션을 적용해 보았다.
'AI 오케스트레이션 캠프 > 일차별 회고' 카테고리의 다른 글
| 14일차 회고|Streamlit·FastAPI CRUD 연동|AI 오케스트레이션 개발자 국비지원 (0) | 2026.07.29 |
|---|---|
| 13일차 회고|Streamlit·FastAPI API 연동과 팀 프로젝트|AI 오케스트레이션 개발자 국비지원 (0) | 2026.07.28 |
| 11일차 회고|Streamlit 상태 관리와 설문 앱|AI 오케스트레이션 개발자 국비지원 (0) | 2026.07.24 |
| 9일차 회고|Redis 캐시와 컨텍스트·Supabase·Render 연동|AI 오케스트레이션 개발자 국비지원 (0) | 2026.07.22 |
| 8일차 회고|FastAPI·Supabase CRUD 연동과 Render 배포·GitHub 협업|AI 오케스트레이션 개발자 국비지원 (0) | 2026.07.21 |
댓글