AI 파이썬 Lab · 심화 · 7주차
심화 · 실전 웹앱 ②

실전 웹앱 ② 배포

지난주가 'AI와 함께 프로토타입'이라면, 오늘은 내 힘으로 완성하고 인터넷에 배포합니다. 끝나면 "내 서비스가 인터넷에 떠 있다"고 말할 수 있어요.

오늘의 목표

오늘 배우는 것

지난주에 받은 피드백을 직접 반영해 앱을 완성하고, 내 코드 구조를 이해한 뒤, 인터넷에 배포해 친구가 실제로 쓰게 합니다.

🛠️
GOAL 1
받은 피드백을 직접 반영해 앱을 완성한다
🧩
GOAL 2
내 코드를 입력·처리·출력 3덩어리로 이해한다
🌍
GOAL 3
인터넷에 배포해 실사용 테스트까지 한다
새 개념 ①

requirements.txt란?

내 앱을 인터넷에 배포할 때, 이 파일이 어떤 라이브러리가 필요한지를 서버에 알려줘요.

🧳 비유: 여행 갈 때 챙길 짐 목록표
여행을 갈 때 "칫솔, 옷, 충전기..."처럼 챙길 물건을 목록으로 적어두면, 안 챙기고 빠뜨리는 걸 막을 수 있죠? requirements.txt도 똑같아요. "이 앱을 실행하려면 streamlit, openai가 필요해요"라고 적어두는 목록표예요. 배포 서버는 이 목록을 보고 필요한 도구를 미리 챙겨서 앱을 실행해줘요.
📌 왜 필요할까?
내 컴퓨터에는 필요한 도구가 이미 다 설치돼 있어요. 그런데 인터넷에 올릴 때는 코드만 올라가고 도구는 같이 안 따라가요. 그래서 이 목록표가 없으면, 배포 서버는 무엇을 챙겨야 할지 몰라서 앱이 흰 화면으로 멈춰요.
개념

완성과 배포 3단계

지난주는 AI와 함께 프로토타입을 만들었어요. 오늘은 한 단계 성장할 차례예요 — 스스로 고치고, 코드를 이해하고, 직접 배포합니다.

1
반영 — 피드백 1순위부터
지난주에 정한 1순위 개선점을 직접 고쳐요. 한 번에 하나씩.
2
이해 — 코드 구조 파악
코드를 모두 외울 필요 없어요. 입력 → 처리 → 출력 큰 구조만 잡으면 돼요.
3
배포 — 1주차 방법 재활용
GitHub 연결 → Streamlit Community Cloud 배포 → Secrets에 키 입력. 1주차에 한 그대로예요.
🔑 API 키는 지난주 그대로
내 컴퓨터에서 앱을 실행할 땐 1주차에 만든 .env 파일을 그대로 써요. 새로 만들 필요 없어요. 오늘은 그 앱을 배포하니까, 인터넷에 올라간 앱을 위해 Secrets 칸에도 같은 키를 한 번 더 넣어줍니다.
🏭 비유: 코드는 공장 라인
긴 코드도 세 덩어리로 나눠 보면 쉬워요. 요리를 만들 때랑 똑같아요. 재료를 넣고(입력) → 요리하고(처리) → 접시에 담아 내놔요(출력). 이 세 칸으로만 나눠도 복잡한 코드가 훨씬 잘 보여요.
💡 오늘의 핵심

"AI가 해주는 것"을 넘어 "내가 이해하고 고치고 배포하는 것"으로 성장하는 시간이에요. 모든 줄을 다 알 필요는 없어요 — 큰 구조만 내 말로 설명할 수 있으면 충분합니다.

미션 1

피드백 반영해 개선하기

🎯 목표: 지난주(6주차) 친구에게 받은 피드백 1순위를 AI에게 요청해 직접 반영한다.

지난주 마지막에 친구가 내 프로토타입을 써보고 "이게 불편해"라고 말해준 것, 기억나나요? 그 피드백 중 1순위로 정한 것 하나를 오늘 고칩니다. 만약 기억이 안 나거나 지난주에 못 했다면, 지금 바로 친구에게 앱을 보여주고 불편한 점 하나를 물어보고 시작하세요.

① 피드백을 구체적인 프롬프트로 바꾸기

"버튼이 이상해" 같은 막연한 말은 AI가 못 알아들어요. 무엇이 어떻게 바뀌어야 하는지를 콕 집어 프롬프트로 만드세요.

📋 피드백 → 프롬프트로 바꾸는 예시 4가지
A. 더 쉽게 (버튼·용어가 헷갈릴 때) → "버튼 이름이 헷갈려. '추가' 대신 '할 일 등록하기'처럼 무슨 뜻인지 바로 알 수 있게 바꿔줘"
B. 더 빠르게 (단계가 많을 때) → "할 일을 입력하고 엔터만 눌러도 추가되게 해줘. 지금은 버튼을 따로 눌러야 해서 불편해"
C. 기능 보강 (뭔가 빠졌을 때) → "완료한 할 일에 체크 표시가 되게 해줘. 지금은 지운 건지 완료한 건지 구분이 안 돼"
D. 디자인 개선 (화면이 안 예쁠 때) → "목록이 그냥 줄글로 나와서 안 예뻐. 할 일마다 카드 모양 박스로 나오게 꾸며줘"

② AI에게 요청하고, 반영 전/후 비교하기

내 상황에 맞는 프롬프트를 하나 골라(또는 내 피드백에 맞게 직접 써서) AI에게 보내고, 실행해서 바뀌기 전과 후를 비교해 보세요.

💬 프롬프트 예시 (기능 보강 사례)
지금 만든 '할 일 관리' 앱에서, 완료한 할 일을 체크 표시로 구분하고 싶어. 할 일 목록마다 체크박스가 생기게 해주고, 나머지 기능은 그대로 둬줘.
💾 요청 전, 먼저 백업

AI에게 요청하기 전에 지금 화면이 잘 작동하는 상태라면, 그 코드를 따로 복사해서 저장해 두세요. 고쳤다가 이상해져도 이전으로 되돌릴 수 있게요. 작은 습관이지만 큰 안심이 돼요.

📸 결과 미리보기
[반영 전] 회색의 작은 "추가" 버튼과 줄글로만 나열된 할 일 목록
📸 결과 미리보기
[반영 후] 크고 또렷한 주황 "+ 할 일 추가" 버튼, 카드 모양으로 바뀐 할 일 목록
⚠️ 자주 하는 실수
  • 피드백이 막연해요("버튼이 이상해") → 위 4가지 예시처럼 무엇을 어떻게 바꿀지 구체적으로 말하세요.
  • 고치니까 다른 게 망가져요 → 요청 전에 코드를 복사해 저장해 두세요.
  • 여러 개를 한꺼번에 바꿔서 원인을 못 찾아요 → 하나씩 고치고 확인하세요.
  • "기존 기능은 그대로 두고"를 빼먹어요 → 프롬프트에 꼭 넣으세요.
미션 2

디버깅하고 코드 이해하기

🎯 목표: 에러를 스스로 해결하고, 내 앱 코드의 구조를 파악한다.

이제 내 코드가 어떻게 돌아가는지 이해할 차례예요. 그런데 AI에게 묻기 전에, 먼저 스스로 짚어봐요.

✏️ 먼저 스스로 해보기
내 코드를 세 부분으로 나눠보기
AI에게 묻기 전, 내 코드를 직접 입력 / 처리 / 출력 세 부분으로 나눠 보세요. 그리고 각 부분이 코드 몇 번째 줄인지 손으로 짚어 보세요.
예: st.text_input → 입력 / ask_ai → 처리 / st.write → 출력.

코드 3덩어리 — 입력 · 처리 · 출력

코드를 다 외울 필요는 없어요. 아래처럼 세 덩어리로만 나누면 큰 구조가 한눈에 보여요.

app.py — 입력·처리·출력 3덩어리
import streamlit as st

# ── ① 입력: 사용자에게 받기 ──
task = st.text_input("할 일을 입력하세요")

# ── ② 처리: AI에게 일 시키기 ──
if st.button("순서 정리"):
    result = ask_ai(f"다음 할 일의 순서를 정리해줘: {task}")
    # ── ③ 출력: 화면에 보여주기 ──
    st.write(result)
1
import streamlit as st
파이썬에게 "streamlit 도구 상자를 st라는 이름으로 꺼내줘"라고 말하는 줄이에요. 이 줄이 없으면 st.로 시작하는 어떤 것도 쓸 수 없어요.
2
task = st.text_input(...)
화면에 입력 칸을 하나 그려요. 사람이 그 칸에 글자를 쓰면, 그 내용이 task라는 상자에 담겨요. — ① 입력 단계예요.
3
if st.button("순서 정리"):
화면에 버튼을 하나 그려요. "만약 이 버튼을 눌렀다면 아래 줄을 실행해"라는 뜻이에요. 안 누르면 아래 줄은 실행되지 않아요.
4
result = ask_ai(f"...{task}")
상자 task에 담긴 내용을 AI에게 보내고, AI가 정리해준 답을 result라는 새 상자에 담아요. — ② 처리 단계예요.
5
st.write(result)
result 상자에 담긴 내용을 화면에 글자로 보여줘요. — ③ 출력 단계예요. 이 한 줄 덕분에 사람이 결과를 눈으로 볼 수 있어요.
📸 결과 미리보기
app.py 실행 화면 — 할 일을 입력하고 AI가 순서를 정리해준 결과

코드 로직 파악 활동지

아래 활동지에 내 코드 구조를 직접 정리해 봅니다.

🧩
코드 로직 파악 활동지
내 앱 코드를 입력·처리·출력으로 나누고, 핵심 줄 5개를 골라 "이 줄은 ___하는 코드"라고 한글로 설명하기

코드가 길어 어디가 뭔지 모르겠다면, 앞서 배운 입력·처리·출력 3덩어리 구조를 다시 떠올리며 내 말로 정리해 보세요.

▸ 활동지 작성 예시
① 입력  : task = st.text_input(...)  → 할 일을 받는 줄
② 처리  : result = ask_ai(...)        → AI가 순서를 정리하는 줄
③ 출력  : st.write(result)            → 결과를 화면에 보여주는 줄
📸 스크린샷 자리
코드 로직 파악 활동지에 핵심 줄 5개를 한글로 설명한 모습
⚠️ 자주 하는 실수
  • 코드가 너무 길어 어디가 뭔지 몰라요 → AI에게 3부분 분류를 요청한 뒤 내 말로 재정리.
  • AI 설명을 그대로 베껴요 → 내 말로 다시 써야 진짜 내 것이 돼요.
  • 모든 줄을 다 이해하려 해요 → 큰 구조(입력·처리·출력)만 잡으면 충분해요.
미션 3

배포하고 실사용 테스트

🎯 목표: 완성한 앱을 인터넷에 배포하고, 친구가 실제로 쓰게 한다.

이제 마지막이에요. 1주차에 배운 방법 그대로, Streamlit Community Cloud에 올리면 폰으로 접속되는 주소가 생겨요.

배포 3단계

1
GitHub에 코드 올리기
완성한 앱 코드를 GitHub 저장소에 올려요.
2
Streamlit Cloud에 연결
Streamlit Community Cloud에서 그 저장소를 선택하면 앱이 자동으로 만들어져요.
3
키는 Secrets 칸에
배포 화면의 'Secrets' 칸에 선생님이 알려준 형식대로 키를 넣어요. 코드에는 키를 적지 않아요.

배포 전 체크 — requirements.txt

배포하려면 "이 앱은 어떤 라이브러리가 필요해요"를 알려주는 목록 파일이 있어야 해요. 없으면 AI에게 "이 앱의 requirements.txt를 만들어줘"라고 요청하세요.

requirements.txt
streamlit
openai
📸 스크린샷 자리
Streamlit Community Cloud 'Deploy an app' 화면 — 저장소·브랜치·실행 파일 경로 입력
📸 스크린샷 자리
Advanced settings의 Secrets 칸에 OPENAI_API_KEY를 넣는 화면(키 값은 가려짐)

🃏 선택지 카드 — 배포 전 마지막 다듬기

배포하기 전, 앱을 하나만 더 다듬어 봅시다. 하나를 골라 AI에게 요청해 보세요.

A
사용 안내
앱 위에 사용법을 한 줄로
난이도 ★☆☆
→ "앱 위에 사용법을 한 줄로 안내해줘"
B
제목·아이콘
어울리는 제목과 이모지 넣기
난이도 ★★☆
→ "앱에 어울리는 제목과 이모지를 넣어줘"
C
빈 화면 처리
입력이 비면 안내 메시지
난이도 ★★☆
→ "입력이 비어 있으면 안내 메시지를 보여줘"
D
모바일 보기
폰 화면에서도 깔끔하게
난이도 ★★★
→ "폰 화면에서도 깔끔하게 보이게 정리해줘"
E
나만의 아이디어!
위에 없는 다듬기를 직접 떠올려 AI에게 요청하기
📱 완성!

배포가 끝나면 https://...streamlit.app 주소가 생겨요. 폰으로 직접 열어 보고, 친구에게도 보내 실제로 써보게 하세요. 내가 만든 서비스가 인터넷에 올라가 있는 거예요.

📸 스크린샷 자리
완성된 앱을 폰 브라우저로 접속한 화면
⚠️ 자주 하는 실수
  • 흰 화면/에러가 떠요 → 대부분 requirements.txt 누락 또는 Secrets에 키를 안 넣어서예요.
  • GitHub에 .env(키) 파일을 올리면 절대 안 돼요 → 키는 배포 화면의 Secrets에만.
  • 코드를 다시 올렸는데 앱이 그대로면 → 잠시 기다리거나 'Reboot'을 눌러요.
🔒 힌트 — 배포한 앱에서 에러가 떠요

가장 흔한 원인 두 가지예요.

requirements.txt 누락 — AI에게 "이 앱의 requirements.txt를 만들어줘"라고 요청해 저장소에 추가.

Secrets 미설정 — 배포 설정의 Secrets 칸에 키를 넣었는지 확인. 형식은 선생님 안내를 따르세요.

보너스 미션

더 해보고 싶다면

미션 3까지 끝내고 시간이 남는다면 도전해 보세요. 끝내지 못해도 괜찮습니다.

보너스 · 가이드 페이지

앱 사용법을 접었다 펼 수 있는 안내 영역을 만들어 봅니다.

app.py (사용법 안내 예시)
# 접었다 펼 수 있는 사용법 안내 영역
with st.expander("📖 사용법 보기"):
    st.write("1. 할 일을 입력하세요")
    st.write("2. '순서 정리' 버튼을 눌러요")
    st.write("3. AI가 정리한 순서가 아래에 나와요")
1
with st.expander("📖 사용법 보기"):
"사용법 보기"라고 적힌 접었다 펼 수 있는 상자를 화면에 만들어요. 평소엔 접혀 있어서 화면을 덜 차지해요.
2
st.write("1. ...")
그 상자를 펼쳤을 때 보이는 안내 문장이에요. 들여쓰기된 줄들은 모두 상자 에 들어가요.
사용법 안내 영역 실행 화면 — 📖 사용법 보기를 눌러 펼친 모습
사용법 안내 영역 실행 화면 — '📖 사용법 보기'를 눌러 펼친 모습
🎯 성공 기준
사용 카운터 숫자가 올라가거나, 접었다 펼 수 있는 사용법 안내가 화면에 보이면 성공이에요.
정리

오늘의 핵심 정리

1️⃣
완성
피드백을 내 힘으로 반영해 앱을 완성했다
2️⃣
이해
디버깅하고 코드 구조(입력·처리·출력)를 파악했다
3️⃣
배포
인터넷에 배포해 실사용 테스트까지 마쳤다
📌 다음 주 예고

다음 주(8주차)는 Notion으로 포트폴리오를 세팅합니다. 지금까지 만든 베스트 작품을 정리하고, 자율 프로젝트 기획서를 준비해요. 완성한 앱 주소를 가족·친구에게 공유하고 사용 후기를 한 줄 받아오세요.

🔧 막혔을 때 — 자가 디버깅 4단계

에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해 봅니다.

1
에러 메시지 읽기
빨간 글자에서 '몇 번째 줄'과 '무슨 에러'인지 찾아본다.
2
AI에게 보여주기
에러 메시지를 복사해서 "이 에러를 수정해줘"라고 AI에게 요청한다.
3
고쳐서 다시 실행
AI가 준 수정 코드를 적용하고 다시 실행해 본다.
4
선생님께 질문
그래도 안 되면 '에러 메시지 + 내가 시도한 것'을 함께 설명한다.