프로젝트 기획 + 서버 배포
기초 마지막 시간에 예고했던 그 말, 기억나나요? "심화에서는 진짜 서비스를 만든다"던 그 시간이 오늘 시작됩니다. 앞으로 11주 동안 무엇을 만들지 살펴보고, 첫 프로젝트를 기획하고, 실제로 서버에 앱을 올려봅니다.
오늘 배우는 것
드디어 심화 과정 첫 수업이에요. 오늘은 앞으로 11주 동안 무엇을 만들지 지도를 그려보고, 좋은 프로젝트를 기획하는 법을 배우고, 노션에 내 포트폴리오 공간을 만듭니다. 마지막엔 작은 앱 하나를 실제로 인터넷에 올려서, 전 세계 누구나 볼 수 있게 만들어봅니다.
노션(Notion)이란?
여러분은 지금까지 만든 앱과 배운 것들을 어디에 기록해왔나요? 오늘부터는 한 곳에 모아 쌓아갑니다. 그 공간이 노션이에요.
📄 AI Python Lab 기록
┣ 📁 포트폴리오 홈 (보너스 미션)
┃ ┗ 프로젝트 5개 표
┗ 📁 프로젝트 1: 웹앱 (오늘 작성)
┣ 프로젝트 이름
┣ 만들게 된 이유
┣ 주요 기능
┣ 기대 효과
┗ 한 줄 소개- 페이지를 만들고 공유 설정을 안 함 → 선생님이 확인할 수 없으니, 안내받은 대로 공유·권한을 꼭 설정하세요.
- 제목 없이 내용부터 씀 → 페이지 최상단에 프로젝트 이름을 먼저 적어야 나중에 찾기 쉬워요.
- 기록을 미루다가 몰아서 나중에 작성 → 그 순간엔 기억나던 디테일(어떤 에러였는지, 어떻게 고쳤는지)이 다음 주엔 흐려져요.
- 페이지 구조를 계속 새로 갈아엎음 → 처음 정한 표·칸 구성을 최대한 유지해야 나중에 비교하기 쉬워요.
- 이미지·스크린샷 없이 글로만 기록 → 배포 화면, 실행 결과 스크린샷을 함께 남기면 나중에 훨씬 이해하기 쉬운 기록이 됩니다.
🗂️ 힌트 — 노션 페이지를 어떻게 시작해야 할지 막막해요
완벽하게 꾸미려 하지 말고, 우선 제목 하나 + 표 하나로 시작하세요. 꾸미기는 나중에 시간이 남을 때 해도 늦지 않습니다.
템플릿을 복제하는 방법을 모르겠다면, 선생님이 공유한 링크에서 오른쪽 위 [복제] 또는 [Duplicate] 버튼을 찾아보세요.
심화 과정 11주, 무엇을 만들까?
기초 11주 동안 여러분은 챗봇, 날씨 알리미, 웹사이트, 게임, 이미지 갤러리처럼 짧은 실습을 여러 개 만들었어요. 심화에서는 다릅니다. 주제 하나를 골라 2주씩 시간을 들여, 실제로 완성해서 배포하는 프로젝트를 5번 반복합니다.
1주차 : 오리엔테이션 (오늘)
2~3주차 : 프로젝트 1 — 웹앱
4~5주차 : 프로젝트 2 — 데이터 저장
6주차 : 프로젝트 3 — 데이터 시각화
7~8주차 : 프로젝트 4 — AI 에이전트
9~10주차 : 프로젝트 5 — API 매시업
11주차 : 발표회프로젝트 하나씩 조금 더 들여다보기
다섯 프로젝트가 실제로 어떤 모습일지 감이 잘 안 온다면, 아래 설명을 참고하세요. 오늘은 이해만 하면 충분하고, 각 프로젝트는 해당 주차에 자세히 다룹니다.
- "5개 프로젝트 = 5번 새로 배운다"로 오해 → 사실은 같은 흐름(기획→구현→배포)을 반복하며 점점 더 큰 걸 붙이는 구조예요.
- 2주 중 1주차 성과가 2주차로 이어지지 않는다고 생각 → 1주차에 기획하고 시작한 코드를 2주차에 그대로 이어받아 완성합니다.
- 발표회를 마지막에만 신경 쓰면 된다고 생각 → 발표에 쓸 프로젝트는 그때 정하는 게 아니라, 11주 내내 노션에 잘 정리해둔 프로젝트 중에서 고르게 됩니다.
🗺️ 힌트 — 5개 프로젝트 이름이 잘 안 외워져요
순서를 외우기보다 흐름으로 기억하세요. "만들고(1) → 저장하고(2) → 보여주고(3) → 스스로 판단하고(4) → 여러 서비스를 엮는다(5)"처럼 이야기로 이어보면 순서가 자연스럽게 기억나요.
운영 규칙 — 필수 미션 vs 자유 주제
각 프로젝트에는 반드시 넣어야 하는 필수 미션(기술 요건)이 있어요. 예를 들어 프로젝트 1은 "입력→처리→출력 흐름을 갖춘 웹앱을 배포한다"가 필수예요. 하지만 주제는 완전히 자유입니다.
프로젝트 1 (웹앱) : 입력→처리→출력 흐름 배포
프로젝트 2 (데이터 저장): 저장→재불러오기가 되는 기능
프로젝트 3 (시각화) : pandas 분석 + 그래프 표현
프로젝트 4 (AI 에이전트): 여러 단계 자동 판단·행동
프로젝트 5 (API 매시업): 외부 API 2개 이상 연동막막할 땐 세 가지 방향 중 하나로 시작해보세요.
① 내 불편함: 아침마다 준비물을 깜빡함
② 주변 관찰: 동생이 숙제를 자꾸 미룸
③ 관심 분야: 좋아하는 축구 경기 일정 확인- "자유"라는 말에 필수 미션까지 생략해도 된다고 오해 → 기술 요건은 주제와 상관없이 반드시 구현해야 완성으로 인정됩니다.
- 완벽한 아이디어가 떠오를 때까지 기획을 미룸 → 오늘 미션1에서는 지금 떠오르는 것 중 가장 나은 것으로 일단 시작하고, 다음 주에 다듬어도 됩니다.
- 친구와 완전히 똑같은 주제를 그대로 베낌 → 참고는 좋지만, 문제정의 문장 하나만이라도 내 상황에 맞게 바꿔보세요.
🎨 힌트 — 필수 미션과 자유 주제가 계속 헷갈려요
이렇게 구분해보세요. "어떻게(How) 만들지"에 대한 규칙은 필수 미션이고, "무엇을(What) 만들지"는 자유 주제예요. "입력→처리→출력 흐름"은 어떻게 만들지에 대한 규칙(고정), "인사말 앱이냐 공부 도우미냐"는 무엇을 만들지(자유)입니다.
좋은 프로젝트 기획법
기초 8주차 게임 기획 4단계, 11주차 3줄 기획서 기억하나요? 오늘은 그걸 프로젝트 규모에 맞게 좀 더 체계적으로 확장합니다. 순서는 똑같아요 — 문제부터 정의하고, 기능을 추리고, 가장 작은 완성형을 정합니다.
코드부터 짜면 만들다가 방향이 자꾸 바뀝니다. 문제와 기능을 먼저 글로 정리해두면, 막혔을 때 "원래 뭘 만들려고 했지?"로 돌아올 기준이 생겨요.
문제정의를 좁히는 연습을 해봅니다.
사람들은 시간 관리를 잘 못한다.
→ 누가, 언제, 무엇이 문제인지 알 수 없어
기능을 정하기 어렵습니다.중간고사 기간의 중3 학생은, 과목이
5개 이상 겹칠 때 어떤 순서로 공부할지
정하지 못해 시간을 허비한다.
→ 누가(중3 학생), 언제(중간고사 기간),
무엇이(공부 순서) 명확합니다.1. "이 앱은 오늘 준비물을 알려줘요." (10초)
2. 시간표를 입력한다. (30초)
3. 버튼을 누른다. (5초)
4. AI가 준비물 목록을 보여준다. (10초)
5. "이렇게 매일 아침이 편해져요!" (15초)📝 힌트 — 핵심기능 3개가 자꾸 겹쳐 보여요
세 기능이 비슷해 보인다면, "입력을 받는 기능 / AI가 처리하는 기능 / 결과를 보여주는 기능"처럼 흐름 순서대로 나눠보세요. 프로젝트 1의 필수 미션인 "입력→처리→출력" 구조와도 자연스럽게 맞아떨어집니다.
- 문제정의를 너무 광범위하게 씀(예: "학생들이 공부를 힘들어한다") → "누가, 어떤 상황에서"까지 구체적으로 좁혀야 기능도 명확해져요.
- 핵심기능을 "~할 수 있다" 없이 명사로만 나열 → "AI 추천"보다 "입력한 과목을 AI가 우선순위로 정렬해준다"처럼 동작으로 적어야 나중에 코드로 옮기기 쉬워요.
- MVP를 정해놓고 핵심기능 3개를 전부 다 넣어버림 → MVP는 3개 중에서도 가장 작은 조각 하나여도 충분해요.
내 프로젝트 1 기획서 쓰기
정답이 정해진 미션이 아니에요. 지금부터 여러분이 다음 2주 동안 무엇을 만들지 스스로 정하는 시간입니다.
① 학교생활 — 준비물 챙기기
② 취미 — 게임 전략 추천
③ 용돈 관리 — 소비 습관 점검
④ 가족과의 대화 — 저녁 메뉴 정하기
⑤ 취미 — 오늘 기분에 맞는 음악 추천② 핵심기능 1개: 그 문제를 풀 수 있는 기능을 하나만 떠올려보세요. (여러 개가 떠올라도 가장 중요한 것 하나만)
③ MVP: 그 기능이 "이 정도만 되면 완성이라 부를 수 있다"는 최소 기준을 한 줄로 적어보세요.
세 가지를 다 적기 전에는 다음 내용을 보지 마세요.
① 노션 기획서 템플릿 채우기
선생님이 만든 노션 기획서 템플릿을 복제해서 시작합니다. 프로젝트 이름·만들게 된 이유·주요 기능·기대 효과·한 줄 소개, 다섯 칸을 채우면 완성이에요.
프로젝트 이름: 오늘의 준비물
만들게 된 이유: 매일 아침 오늘 뭘 챙겨야
하는지 헷갈려 준비물을 빠뜨리고 온다.
주요 기능:
1. 요일별 시간표 입력
2. AI가 오늘 필요한 준비물 목록 추천
3. 챙긴 준비물 체크 표시
기대 효과: 아침마다 준비물을 다시
확인하러 뛰어가는 일이 줄어든다.
한 줄 소개: 시간표만 입력하면 오늘
챙길 준비물을 AI가 알려주는 도우미② AI에게 기획서 다듬기 요청하기
초안을 적었다면, AI 도구에게 더 명확하게 다듬어달라고 요청해보세요.
문제정의: 시험 기간에 어떤 과목부터 공부해야 할지
정하기 어려워 시간을 낭비하는 학생이 많다.
핵심기능:
1. 과목별 남은 시험일과 난이도 입력
2. AI가 우선순위 순서로 추천
3. 오늘 할 일 체크리스트 표시
MVP: 과목명과 시험일만 입력하면
AI가 공부 순서를 추천해주는 화면 1개문제정의: 헬스장에 처음 다니는 사람은 오늘
어떤 운동을 몇 세트 해야 할지 몰라 시간을 허비한다.
핵심기능:
1. 운동 목표(다이어트/근력) 선택
2. AI가 오늘의 운동 루틴 3가지 추천
3. 완료한 운동 체크 표시
MVP: 목표만 고르면 AI가 운동 루틴
텍스트로 1개 추천해주는 화면 1개③ 완성된 기획서, 팀원 관점에서 다시 읽기
기획서를 다 채웠다면, 처음 보는 사람이 됐다고 생각하고 다시 읽어보세요. "이 문장만 읽고 무엇을 만들지 이해되는가?"가 기준이에요.
다섯 칸을 다시 한번 짚어봅니다.
- 핵심기능을 5개, 6개로 늘림 → 3개로 줄이는 게 기획의 핵심입니다.
- MVP를 "완벽한 최종 버전"으로 적음 → MVP는 가장 작은 완성형이어야 해요.
- 노션 페이지 없이 머릿속으로만 기획 → 반드시 글로 남겨야 다음 주에 참고할 수 있어요.
- 기대 효과를 "재미있을 것 같다"처럼 막연하게 적음 → "누가 어떤 시간을 아끼는지"처럼 구체적으로 적어보세요.
- 다섯 칸을 채우고 공유 설정을 확인 안 함 → 선생님이 열람할 수 있는 상태인지 꼭 확인하세요.
💡 힌트 — 문제정의 문장이 잘 안 써져요
"[누가] + [어떤 상황에서] + [무엇이 불편한가]" 세 조각을 순서대로 채워보세요. 예: "[헬스장 초보자]가 [처음 운동하러 갔을 때] [어떤 순서로 해야 할지 몰라 헤맨다]."
그래도 막히면, 오늘 하루 나를 불편하게 했던 사소한 순간 하나를 떠올려보세요. 사소할수록 오히려 명확한 문제정의가 나옵니다.
④ 좋은 기획서와 아쉬운 기획서 비교하기
같은 아이디어라도 어떻게 적느냐에 따라 기획서의 명확도가 크게 달라져요. 아래 두 버전을 비교하면서, 내 기획서가 어느 쪽에 가까운지 점검해보세요.
프로젝트 이름: 공부 도우미
만들게 된 이유: 공부가 힘들어서
주요 기능: 공부를 도와주는 기능
한 줄 소개: 공부를 더 잘하게 해주는 앱프로젝트 이름: 오늘의 공부 순서
만들게 된 이유: 시험 기간에 어떤 과목부터
공부해야 할지 몰라 시간을 낭비하는 학생이 많음
주요 기능: 과목별 시험일·난이도를 입력하면
AI가 오늘 할 일 순서를 추천
한 줄 소개: 과목명과 시험일만 입력하면 AI가
공부 순서를 정해주는 화면 1개⑤ 짝과 서로의 기획서 바꿔 읽기
시간이 된다면 옆 사람과 노션 기획서를 서로 보여주고, 상대방 입장에서 "이해가 되는지" 피드백을 주고받으세요. 내가 쓸 땐 명확해 보여도 남이 읽으면 헷갈리는 부분이 꼭 있어요.
서로 피드백할 때 아래 세 가지를 체크해보세요.
- "괜찮은 것 같아"처럼 막연한 칭찬만 함 → 위 세 가지 체크리스트 중 구체적으로 무엇이 좋았는지, 무엇이 헷갈렸는지 짚어주세요.
- 상대방 아이디어를 내 취향대로 바꾸라고 강요 → 주제는 각자의 자유이니, 이해가 안 되는 표현만 짚어주는 게 좋아요.
다음 주에 실제로 구현을 시작하면서 기획이 조금씩 바뀌는 건 자연스러운 일이에요. 오늘의 기획서는 "정답"이 아니라 출발점입니다. 방향을 잡는 데 의미가 있어요.
간단한 앱 만들어 서버에 배포하기
6주차에 GitHub 저장소를 만들어 GitHub Pages에 정적 웹사이트를 올려봤죠? 오늘은 다른 종류의 배포를 배웁니다. 그때는 HTML 파일을 그대로 올렸다면, 오늘은 파이썬으로 만든 앱을 올립니다.
st.title(...), st.button(...)처럼 파이썬 코드 몇 줄만으로 웹 화면을 자동 생성해주는 라이브러리예요. 데이터·AI를 다루는 사람들이 화면 개발에 시간을 뺏기지 않도록 만들어졌어요.① Streamlit 설치하기
먼저 도구를 설치합니다. 터미널에 (venv) 표시가 있는지 확인하고 입력하세요.
# (venv) 표시 확인 후 설치
pip install streamlit openaiSuccessfully installed streamlit-1.x.x openai-1.x.x
...
Collecting streamlit
Downloading streamlit-1.x.x-py3-none-any.whl
Successfully installed streamlit-1.x.x- 터미널에
(venv)가 안 보이는데 그냥 설치 → 가상환경 밖에 깔리면 다음 시간에 다시 못 찾을 수 있어요.source venv/bin/activate(맥) 또는venv\Scripts\activate(윈도우)로 먼저 켜세요. - 설치 중 인터넷이 끊겨 일부만 설치 → 같은 명령어를 한 번 더 실행하면 이어서 설치됩니다.
pip대신pip3를 써야 하는 환경에서 헷갈림 → 에러 메시지에 "command not found"가 뜨면pip3 install로 다시 시도하세요.
streamlit hello를 입력하면, Streamlit이 기본으로 제공하는 샘플 앱이 브라우저에 자동으로 열려요. 이 화면이 뜬다면 설치가 정상적으로 완료된 것입니다. 확인 후 Ctrl+C로 종료하고 다음 단계로 넘어가세요.streamlit hello You can now view your Streamlit app
in your browser.
Local URL: http://localhost:8501
Network URL: http://192.168.x.x:8501streamlit hello는 Streamlit이 미리 만들어둔 샘플 앱을 보여줘요. 우리가 만든 코드가 아니라 설치 확인용이에요. 다음 단계부터 쓸 streamlit run streamlit_app.py는 우리가 직접 작성한 파일을 실행하는 명령어입니다.② API 키 준비 — ask_ai 함수 만들기
이 앱은 AI에게 인사말을 부탁할 거예요. 그러려면 API 키가 필요해요. 기초 2주차부터 하던 대로, .env에 키를 넣고 코드에는 직접 적지 않습니다.
.env처럼 따로 분리된 파일에 두고, 코드에서는 그 파일을 "불러와서" 씁니다.client = OpenAI(api_key="sk-abc123...")
→ 키가 코드에 그대로 보여요. GitHub에
올리는 순간 전 세계에 공개됩니다.OPENAI_API_KEY=여기에_선생님이_알려준_키_붙여넣기그리고 AI를 부르는 짧은 함수 하나를 만들어 두면, 앞으로 계속 재사용할 수 있어요.
from openai import OpenAI
client = OpenAI() # 키는 .env에서 자동으로
def ask_ai(prompt):
res = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
return res.choices[0].message.contentask_ai("질문")이라고 쓰면 AI에게 질문을 보내고 답을 글자로 돌려줘요. 이 함수가 있어야 Secrets에 넣은 키가 실제로 쓰입니다 — 키만 넣고 안 쓰면 의미가 없어요.
client = OpenAI().env(또는 Secrets)의 키를 자동으로 찾아서 연결합니다.def ask_ai(prompt):ask_ai("질문")이라고만 쓰면 되도록, 반복될 요청 과정을 함수 하나로 묶어두는 부분이에요.client.chat.completions.create(...)model은 어떤 AI를 쓸지 정해요.return res.choices[0].message.contentpython을 실행하고 ask_ai("안녕이라고 인사해줘")를 직접 호출해보면 함수가 잘 작동하는지 먼저 확인할 수 있어요. 화면 코드에 문제가 있는지, 함수 자체에 문제가 있는지 구분하는 좋은 방법입니다.>>> ask_ai("안녕이라고 인사해줘")
'안녕하세요! 오늘도 좋은 하루 보내세요 😊'AuthenticationError: Could not resolve
authentication method. Expected either
api_key or auth_token to be set.
→ 원인: .env 파일이 없거나, 파일 이름이
".env"가 아니거나(".env.txt" 등), 코드
파일과 다른 폴더에 있는 경우입니다..env파일 없이 바로 실행 →OPENAI_API_KEY를 찾을 수 없다는 에러가 뜹니다..env파일이 코드 파일과 같은 폴더에 있는지 확인하세요.- 함수 이름을
ask_ai가 아닌 다른 이름으로 바꿔놓고 나중에 헷갈림 → 앞으로 여러 주차에서 이 이름을 계속 재사용하니 통일해두는 게 좋아요. model이름을 오타로 잘못 입력 → 존재하지 않는 모델을 요청하면 에러가 뜹니다. 코드에 적힌 이름을 그대로 사용하세요.- 파일 이름을
.env.txt로 저장(메모장 등에서 자동으로 확장자 추가) → 반드시.env로 끝나는지 파일 탐색기에서 확인하세요.
🔑 힌트 — AuthenticationError가 계속 떠요
① .env 파일이 streamlit_app.py와 정확히 같은 폴더에 있는지 확인하세요.
② 파일 안 내용이 OPENAI_API_KEY=키값 형태로, 등호(=) 앞뒤에 공백 없이 적혀 있는지 확인하세요.
③ 그래도 안 되면 터미널을 완전히 껐다가 다시 열고 가상환경을 재활성화한 뒤 실행해보세요.
③ 화면 만들고 실행하기
화면이 있는 파이썬 앱은 아래처럼 짧게 만들 수 있어요. AI에게 "Streamlit으로 이름을 입력받아 AI가 인사말을 만들어주는 앱 만들어줘"라고 요청하면 이런 코드를 받게 됩니다.
import streamlit as st
st.title("👋 나의 첫 배포 앱")
name = st.text_input("이름을 입력하세요")
if st.button("인사받기"):
prompt = f"{name}이라는 이름의 심화 과정 학생에게 짧고 따뜻하게 환영 인사를 한 문장으로 해줘"
st.write(ask_ai(prompt))저장한 파일 이름이 streamlit_app.py라면, 터미널에서 아래처럼 실행합니다.
streamlit run streamlit_app.py👋 나의 첫 배포 앱
이름을 입력하세요: [ 지민 ]
[ 인사받기 ]
지민님, 심화 과정에 오신 걸 환영해요! 함께 멋진 프로젝트 만들어봐요 🎉👋 나의 첫 배포 앱
이름을 입력하세요: [ 서연 ]
[ 인사받기 ]
서연님! 심화 과정 첫걸음을 응원해요.
멋진 프로젝트 5개, 함께 완성해봐요 ✨st.title(...) · st.text_input(...)name 변수에 담습니다.if st.button(...):prompt = f"..."{name} 자리에 실제 입력값을 끼워 넣어, AI에게 보낼 질문 문장을 완성합니다.st.write(ask_ai(prompt))ask_ai()에 넘겨 AI의 답을 받고, 그 결과를 화면에 표시합니다.AI는 같은 질문에도 매번 표현을 조금씩 바꿔서 답합니다. 정해진 한 문장을 복사해서 보여주는 게 아니라, 그때그때 새로 문장을 만들어내기 때문이에요. 이 특성 때문에 같은 이름을 넣어도 인사말이 매번 달라져요.
- 파일 이름을
streamlit_app.py가 아닌 다른 이름으로 저장 → 실행 명령어의 파일명과 반드시 일치해야 해요. - 이름을 입력하지 않고 버튼만 누름 →
f"{name}..."의name이 빈 문자열이 되어 어색한 인사말이 나올 수 있어요. - 터미널을 닫으면 앱도 꺼짐 → 로컬 실행 중엔 터미널 창을 계속 열어둬야 브라우저에서 앱이 보여요.
④ 배포 3단계
내 컴퓨터에서만 돌던 이 앱을, Streamlit Community Cloud라는 무료 서비스에 올리면 전 세계 어디서나 열리는 주소가 생깁니다.
streamlit_app.py와 requirements.txt를 올립니다....streamlit.app)입니다.Streamlit Cloud는 여러분의 컴퓨터에서 직접 파일을 받지 않아요. 대신 GitHub에 올라간 코드를 가져가서 실행합니다. 그래서 배포하려면 항상 "코드를 GitHub에 올리기"가 먼저예요 — 이 순서를 기억해두면 다음 프로젝트에서도 헷갈리지 않아요.
실제 화면으로 따라가기
아래 9장을 순서대로 따라가면 GitHub 저장소 생성부터 Streamlit 배포 완료까지 그대로 진행할 수 있어요.
1단계 — GitHub에 코드 올리기 (①~②)
- 저장소 이름에 띄어쓰기나 한글을 사용 → 영어·숫자·하이픈만 쓰는 게 안전해요.
streamlit_app.py를 폴더 안에 넣고 업로드 → 나중에 Main file path를 입력할 때 폴더 경로까지 정확히 적어야 해서 헷갈립니다. 저장소 최상위에 바로 올리세요.requirements.txt를 깜빡하고 코드 파일만 업로드 → 3단계(New app)에서 앱은 만들어지지만 실행 중 에러가 납니다.
2단계 — Streamlit Cloud 로그인 (③~⑤)
- 다른 사람의 GitHub 계정으로 로그인 → 나중에 자신의 저장소가 목록에 안 보입니다. 반드시 본인 계정으로 로그인하세요.
- 로그인 창이 팝업 차단으로 안 뜸 → 브라우저의 팝업 차단 알림을 확인하고 허용해주세요.
3단계 — 앱 생성과 설정 (⑥~⑨)
main), Main file path는 실행할 파이썬 파일 이름(streamlit_app.py)이에요. 세 정보 모두 방금 GitHub 저장소 화면에서 그대로 확인할 수 있어요.- Branch를
main이 아닌 다른 이름으로 착각 → GitHub 저장소 화면에서 실제 브랜치 이름을 먼저 확인하세요. - Main file path에
/streamlit_app.py처럼 맨 앞 슬래시를 넣음 → 슬래시 없이streamlit_app.py만 입력합니다. - Deploy를 누른 뒤 화면이 바로 안 뜬다고 새로고침을 반복 → 처음 배포는 몇 분 정도 걸릴 수 있어요. 로그 화면에 진행 상황이 표시됩니다.
⑤ API 키는 Secrets로 관리하기
방금 로컬에서는 .env로 키를 관리했죠. 배포한 앱에서도 같은 키가 안전하게 동작하도록 만드는 법을 익혀둡니다.
.env 파일에 넣고 코드에 직접 쓰지 않는 습관을 들여왔죠? 배포할 땐 .env 파일 자체를 GitHub에 올리지 않고, 대신 Streamlit Cloud의 Secrets 칸에 같은 값을 넣습니다. 원칙은 똑같아요 — 키는 코드 밖에, 화면에도 노출하지 않는다.OPENAI_API_KEY = "여기에_선생님이_알려준_키_붙여넣기".env 파일과 거의 같은 형식이에요. 줄마다 키이름 = "값" 형태로 적습니다. 코드 안의 OpenAI()는 로컬에서는 .env를, 배포 환경에서는 이 Secrets 칸을 자동으로 찾아서 읽어요 — 코드를 따로 고칠 필요가 없습니다.- 키 값을 따옴표 없이 입력 → 형식에 따라 오류가 날 수 있으니 선생님이 안내한 형식을 그대로 따르세요.
- Secrets를 저장하지 않고 페이지를 이동 → 저장 버튼을 반드시 눌러야 반영됩니다.
- 발표·화면 공유 중 Secrets 화면을 그대로 노출 → 키가 보이는 화면은 절대 캡처·공유하지 않습니다.
...streamlit.app 주소가 브라우저 주소창에 나타납니다.배포에 꼭 필요한 파일
배포하려면 "이 앱은 어떤 라이브러리가 필요해요"를 알려주는 목록 파일이 있어야 해요. AI에게 "이 앱의 requirements.txt를 만들어줘"라고 요청하면 됩니다.
streamlit
openaipip install로 설치해둔 라이브러리가 있죠. 하지만 배포 서버는 완전히 빈 컴퓨터에서 시작해요. requirements.txt가 있어야 서버가 "아, streamlit이랑 openai를 설치해야 하는구나"를 알고 자동으로 설치합니다.지금 단계에서는 streamlit처럼 이름만 적어도 충분해요. 나중에 특정 버전이 필요해지면 streamlit==1.32.0처럼 버전 번호를 붙이는 방법도 있다는 것만 알아두세요.
streamlit==1.32.0
openai==1.14.0ModuleNotFoundError: No module named 'openai'
→ 원인: requirements.txt에 openai가
빠져있거나, 파일 이름이 정확히
"requirements.txt"가 아닌 경우입니다.- 파일 이름을
requirement.txt(s 누락)로 잘못 저장 → 정확히requirements.txt여야 인식됩니다. - 라이브러리 이름 철자를 틀림(예:
steamlit) → 설치 단계에서 바로 실패합니다. - 로컬에서 쓴 모든 라이브러리를 나열하려다 불필요한 것까지 포함 → 이 앱이 실제로 쓰는 것만 적으면 충분해요.
⑥ 배포 후 확인하기 — 내 폰으로도 열어보기
Deploy가 끝나면 https://내앱이름.streamlit.app 형태의 주소가 생깁니다. 이 주소를 여러분의 폰 브라우저에 직접 입력하거나, 주소를 문자로 보내서 열어보세요.
https://내프로젝트이름-랜덤문자.streamlit.app
예시)
https://my-first-app-ab12cd34.streamlit.app- 배포 직후 바로 접속해 로딩 화면만 보고 안 됐다고 판단 → 처음 접속 시 서버가 "잠에서 깨는" 시간이 걸릴 수 있으니 잠시 기다려보세요.
- 주소를 메모하지 않고 창을 닫음 → Streamlit Cloud의 'My Apps' 목록에서 언제든 다시 찾을 수 있지만, 노션에도 주소를 기록해두세요.
⑦ 배포 후 유지·관리하기
앱을 한 번 배포했다고 끝이 아니에요. 앞으로 2주마다 새로운 프로젝트를 배포하게 되니, 배포된 앱을 관리하는 기본 방법도 미리 알아둡니다.
streamlit_app.py 파일을 수정해서 다시 업로드하면, Streamlit Cloud가 몇 초~몇 분 안에 자동으로 최신 코드로 앱을 다시 실행해줘요. 별도로 "재배포" 버튼을 누를 필요는 없지만, 화면을 새로고침해야 바뀐 내용이 보입니다.- 저장소를 Private로 만들면 무료 배포가 안 돼요 → 반드시 Public으로 생성합니다.
- 배포한 앱이 에러 → 대부분
requirements.txt가 빠졌거나 Secrets에 키를 안 넣어서예요. - GitHub에
.env파일(키)을 올리면 절대 안 돼요 → 키는 배포 화면의 Secrets에만 넣습니다. python streamlit_app.py로 실행하면 화면이 안 떠요. 꼭streamlit run streamlit_app.py.- 로컬에서는 잘 되는데 배포 후에만 에러 → 로컬은
.env, 배포는 Secrets로 키 경로가 다르다는 걸 잊은 경우가 많아요. - 코드를 수정했는데 배포된 앱에는 반영이 안 됨 → GitHub 저장소에 수정한 파일을 다시 업로드(커밋)해야 Streamlit Cloud가 자동으로 재배포합니다.
🔄 힌트 — 코드를 고쳤는데 앱에 반영이 안 돼요
GitHub 저장소 화면에서 수정한 파일을 찾아 Edit(연필 아이콘)을 누르거나, 새 버전을 다시 Upload files로 올려서 덮어써야 해요. 로컬 파일만 고치는 것으로는 배포된 앱에 반영되지 않습니다.
업로드 후 Streamlit Cloud의 Manage app 화면에서 "Rerunning" 표시가 뜨면 정상적으로 재배포가 진행 중인 거예요.
🚀 힌트 — Deploy를 눌렀는데 계속 로딩 중이에요
첫 배포는 서버가 라이브러리를 새로 설치하는 과정이라 1~3분 정도 걸릴 수 있어요. 화면 하단의 로그(Manage app → Logs)를 보면 어느 단계에서 멈췄는지 확인할 수 있습니다.
5분이 넘도록 진행이 없다면 requirements.txt의 라이브러리 이름 철자를 다시 확인해보세요. 오타 하나로 설치가 멈추는 경우가 흔해요.
🔒 힌트 — 배포한 앱에서 에러가 떠요
가장 흔한 원인 두 가지예요.
① requirements.txt 누락 — AI에게 "이 앱의 requirements.txt를 만들어줘"라고 요청해 저장소에 추가.
② Secrets 미설정 — 배포 설정의 Secrets 칸에 키를 넣었는지 확인. 형식은 선생님 안내를 따르세요.
더 해보고 싶다면
미션 2까지 끝내고 시간이 남는다면 도전해보세요. 끝내지 못해도 괜찮습니다.
보너스 ① 노션 포트폴리오 홈 꾸미기
기획서 페이지 상위에 "포트폴리오 홈" 페이지를 만들어, 앞으로 5개 프로젝트가 들어갈 자리를 미리 표로 만들어둡니다.
| 프로젝트 | 상태 | 배포 주소 | 배운 점 |
|---------|------|----------|--------|
| 1. 웹앱 | 기획중 | - | - |
| 2. 데이터 저장 | 예정 | - | - |
| 3. 데이터 시각화 | 예정 | - | - |
| 4. AI 에이전트 | 예정 | - | - |
| 5. API 매시업 | 예정 | - | - |표의 각 칸에는 이런 값을 채웁니다.
보너스 ② 배포한 앱 링크 공유하고 후기 받기
완성된 주소를 친구나 가족 1명에게 보내고, 써본 느낌을 물어보세요. "뭐가 재밌었어? 뭘 더하면 좋을까?"를 물어 다음 주 프로젝트 기획에 참고합니다.
후기를 받을 때 아래 세 가지를 순서대로 물어보세요.
- 미션 2를 끝내기 전에 보너스부터 시작 → 필수 미션을 먼저 완료한 뒤에 도전하세요.
- 후기를 받고 노션에 기록하지 않음 → 구두로 들은 피드백도 짧게라도 노션에 남겨야 다음 주에 참고할 수 있어요.
- 포트폴리오 홈 표를 만들고 이후 계속 방치 → 앞으로 매주 배포할 때마다 이 표를 업데이트하는 습관을 지금부터 들여보세요.
후기 (동생): "이름 넣고 버튼 누르니까
바로 인사말이 떴어요! 신기해요."
개선 아이디어: 이모지도 같이 나오면
더 재밌을 것 같다고 함 → 다음에 시도💌 힌트 — 누구에게 후기를 부탁해야 할지 모르겠어요
꼭 개발을 아는 사람이 아니어도 괜찮아요. 오히려 기술을 모르는 가족에게 보여주면 "화면이 이해가 안 된다"처럼 여러분이 놓친 부분을 더 잘 짚어줄 수 있어요.
옆에서 함께 수업 듣는 친구에게 서로의 앱을 바꿔가며 사용해보는 것도 좋은 방법입니다.
오늘의 핵심 정리
오늘 하루 만에 심화 과정의 전체 그림을 보고, 기획서를 쓰고, 실제로 앱 하나를 인터넷에 올렸습니다. 네 가지로 정리해봅니다.
오늘 챙겨가야 할 세 가지를 정리합니다.
- 기획서를 쓰고 나서 다시 안 열어봄 → 다음 주 시작 전에 오늘 쓴 문제정의·핵심기능·MVP를 한 번 더 읽고 오세요.
- 배포 방법을 "한 번 해봤으니 안다"고 생각 → 다음 프로젝트에서도 같은 절차(GitHub 업로드→Streamlit Cloud 연결→Secrets 설정)를 반복하니, 헷갈리면 오늘 교안을 다시 펼쳐보세요.
🔧 막혔을 때 — 자가 디버깅 4단계
에러가 떠도 당황하지 마세요. 선생님께 묻기 전에 이 순서대로 스스로 해결해봅니다.