실전 웹앱 ② 배포
지난주가 'AI와 함께 프로토타입'이라면, 오늘은 내 힘으로 완성하고 인터넷에 배포합니다. 끝나면 "내 서비스가 인터넷에 떠 있다"고 말할 수 있어요.
오늘 배우는 것
지난주에 받은 피드백을 직접 반영해 앱을 완성하고, 내 코드 구조를 이해한 뒤, 인터넷에 배포해 친구가 실제로 쓰게 합니다.
requirements.txt란?
내 앱을 인터넷에 배포할 때, 이 파일이 어떤 라이브러리가 필요한지를 서버에 알려줘요.
완성과 배포 3단계
지난주는 AI와 함께 프로토타입을 만들었어요. 오늘은 한 단계 성장할 차례예요 — 스스로 고치고, 코드를 이해하고, 직접 배포합니다.
"AI가 해주는 것"을 넘어 "내가 이해하고 고치고 배포하는 것"으로 성장하는 시간이에요. 모든 줄을 다 알 필요는 없어요 — 큰 구조만 내 말로 설명할 수 있으면 충분합니다.
피드백 반영해 개선하기
지난주 마지막에 친구가 내 프로토타입을 써보고 "이게 불편해"라고 말해준 것, 기억나나요? 그 피드백 중 1순위로 정한 것 하나를 오늘 고칩니다. 만약 기억이 안 나거나 지난주에 못 했다면, 지금 바로 친구에게 앱을 보여주고 불편한 점 하나를 물어보고 시작하세요.
① 피드백을 구체적인 프롬프트로 바꾸기
"버튼이 이상해" 같은 막연한 말은 AI가 못 알아들어요. 무엇이 어떻게 바뀌어야 하는지를 콕 집어 프롬프트로 만드세요.
B. 더 빠르게 (단계가 많을 때) → "할 일을 입력하고 엔터만 눌러도 추가되게 해줘. 지금은 버튼을 따로 눌러야 해서 불편해"
C. 기능 보강 (뭔가 빠졌을 때) → "완료한 할 일에 체크 표시가 되게 해줘. 지금은 지운 건지 완료한 건지 구분이 안 돼"
D. 디자인 개선 (화면이 안 예쁠 때) → "목록이 그냥 줄글로 나와서 안 예뻐. 할 일마다 카드 모양 박스로 나오게 꾸며줘"
② AI에게 요청하고, 반영 전/후 비교하기
내 상황에 맞는 프롬프트를 하나 골라(또는 내 피드백에 맞게 직접 써서) AI에게 보내고, 실행해서 바뀌기 전과 후를 비교해 보세요.
AI에게 요청하기 전에 지금 화면이 잘 작동하는 상태라면, 그 코드를 따로 복사해서 저장해 두세요. 고쳤다가 이상해져도 이전으로 되돌릴 수 있게요. 작은 습관이지만 큰 안심이 돼요.
- 피드백이 막연해요("버튼이 이상해") → 위 4가지 예시처럼 무엇을 어떻게 바꿀지 구체적으로 말하세요.
- 고치니까 다른 게 망가져요 → 요청 전에 코드를 복사해 저장해 두세요.
- 여러 개를 한꺼번에 바꿔서 원인을 못 찾아요 → 하나씩 고치고 확인하세요.
- "기존 기능은 그대로 두고"를 빼먹어요 → 프롬프트에 꼭 넣으세요.
디버깅하고 코드 이해하기
이제 내 코드가 어떻게 돌아가는지 이해할 차례예요. 그런데 AI에게 묻기 전에, 먼저 스스로 짚어봐요.
예:
st.text_input → 입력 / ask_ai → 처리 / st.write → 출력.코드 3덩어리 — 입력 · 처리 · 출력
코드를 다 외울 필요는 없어요. 아래처럼 세 덩어리로만 나누면 큰 구조가 한눈에 보여요.
import streamlit as st
# ── ① 입력: 사용자에게 받기 ──
task = st.text_input("할 일을 입력하세요")
# ── ② 처리: AI에게 일 시키기 ──
if st.button("순서 정리"):
result = ask_ai(f"다음 할 일의 순서를 정리해줘: {task}")
# ── ③ 출력: 화면에 보여주기 ──
st.write(result)import streamlit as stst라는 이름으로 꺼내줘"라고 말하는 줄이에요. 이 줄이 없으면 st.로 시작하는 어떤 것도 쓸 수 없어요.task = st.text_input(...)task라는 상자에 담겨요. — ① 입력 단계예요.if st.button("순서 정리"):result = ask_ai(f"...{task}")task에 담긴 내용을 AI에게 보내고, AI가 정리해준 답을 result라는 새 상자에 담아요. — ② 처리 단계예요.st.write(result)result 상자에 담긴 내용을 화면에 글자로 보여줘요. — ③ 출력 단계예요. 이 한 줄 덕분에 사람이 결과를 눈으로 볼 수 있어요.코드 로직 파악 활동지
아래 활동지에 내 코드 구조를 직접 정리해 봅니다.
코드가 길어 어디가 뭔지 모르겠다면, 앞서 배운 입력·처리·출력 3덩어리 구조를 다시 떠올리며 내 말로 정리해 보세요.
① 입력 : task = st.text_input(...) → 할 일을 받는 줄
② 처리 : result = ask_ai(...) → AI가 순서를 정리하는 줄
③ 출력 : st.write(result) → 결과를 화면에 보여주는 줄- 코드가 너무 길어 어디가 뭔지 몰라요 → AI에게 3부분 분류를 요청한 뒤 내 말로 재정리.
- AI 설명을 그대로 베껴요 → 내 말로 다시 써야 진짜 내 것이 돼요.
- 모든 줄을 다 이해하려 해요 → 큰 구조(입력·처리·출력)만 잡으면 충분해요.
배포하고 실사용 테스트
이제 마지막이에요. 1주차에 배운 방법 그대로, Streamlit Community Cloud에 올리면 폰으로 접속되는 주소가 생겨요.
배포 3단계
배포 전 체크 — requirements.txt
배포하려면 "이 앱은 어떤 라이브러리가 필요해요"를 알려주는 목록 파일이 있어야 해요. 없으면 AI에게 "이 앱의 requirements.txt를 만들어줘"라고 요청하세요.
streamlit
openai🃏 선택지 카드 — 배포 전 마지막 다듬기
배포하기 전, 앱을 하나만 더 다듬어 봅시다. 하나를 골라 AI에게 요청해 보세요.
배포가 끝나면 https://...streamlit.app 주소가 생겨요. 폰으로 직접 열어 보고, 친구에게도 보내 실제로 써보게 하세요. 내가 만든 서비스가 인터넷에 올라가 있는 거예요.
- 흰 화면/에러가 떠요 → 대부분
requirements.txt누락 또는 Secrets에 키를 안 넣어서예요. - GitHub에
.env(키) 파일을 올리면 절대 안 돼요 → 키는 배포 화면의 Secrets에만. - 코드를 다시 올렸는데 앱이 그대로면 → 잠시 기다리거나 'Reboot'을 눌러요.
🔒 힌트 — 배포한 앱에서 에러가 떠요
가장 흔한 원인 두 가지예요.
① requirements.txt 누락 — AI에게 "이 앱의 requirements.txt를 만들어줘"라고 요청해 저장소에 추가.
② Secrets 미설정 — 배포 설정의 Secrets 칸에 키를 넣었는지 확인. 형식은 선생님 안내를 따르세요.
더 해보고 싶다면
미션 3까지 끝내고 시간이 남는다면 도전해 보세요. 끝내지 못해도 괜찮습니다.
보너스 · 가이드 페이지
앱 사용법을 접었다 펼 수 있는 안내 영역을 만들어 봅니다.
# 접었다 펼 수 있는 사용법 안내 영역
with st.expander("📖 사용법 보기"):
st.write("1. 할 일을 입력하세요")
st.write("2. '순서 정리' 버튼을 눌러요")
st.write("3. AI가 정리한 순서가 아래에 나와요")with st.expander("📖 사용법 보기"):st.write("1. ...")
오늘의 핵심 정리
다음 주(8주차)는 Notion으로 포트폴리오를 세팅합니다. 지금까지 만든 베스트 작품을 정리하고, 자율 프로젝트 기획서를 준비해요. 완성한 앱 주소를 가족·친구에게 공유하고 사용 후기를 한 줄 받아오세요.
🔧 막혔을 때 — 자가 디버깅 4단계
에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해 봅니다.