그럼 "이번 학기에 본 영화를 기록하고 평점 통계를 보여주는 프로그램"을 첫 목표로 잡아볼까요? 만들기 전에 세 가지만 같이 정해요.
- 누가 쓰나요?
- 어떤 불편을 해결하나요?
- 첫 버전에서 꼭 되는 한 가지는 뭔가요?
생성형 AI와 함께 프로젝트를 완주하는 미션형 학습 동반자가 무엇인지, 9종 러닝메이트가 어떻게 구성되고 동작하는지, 실제 대화 사례와 자동으로 쌓이는 노션 학습일지까지 차례로 살펴봅니다.
제목을 누르면 해당 부분으로 바로 이동합니다.
학습자의 짧고 모호한 한마디 안에는 학업 · 진로 · 정서 · 제도 · 사고방식이 함께 들어 있습니다. AI 러닝메이트는 이를 분리해 단계형 대화로 전환하고, 상담 · 탐구 · 진단 · 성찰을 하나로 잇는 AI 학습지원 에이전트입니다.
초개인화 엔진. 학생을 점수 하나가 아니라 학업이력 · 관심 · 성향 · 활동 · 상담 맥락으로 종합 이해하고, 학사 · LMS · 상담 · 비교과 데이터와 실시간으로 연결돼 상담의 깊이와 실행 가능성을 높입니다.
이 포트폴리오에 새로 더해지는 7번째 러닝메이트→바이브코딩 러닝메이트 세트입니다.
생성형 AI와 함께 프로젝트를 완주하는 학습자를 위한 미션형 학습 동반자입니다. 코드를 대신 만드는 도구가 아니라, 무엇을 만들지 정의하고 · 실행하고 · 검증하고 · 디버깅하고 · 회고하는 과정을 길러줍니다.
같은 "AI로 코딩하기"처럼 보여도 목표가 다릅니다. 범용 도구는 결과 코드를 빠르게 내놓고 끝나지만, 러닝메이트는 그 과정을 학습자가 직접 거치고 기록으로 남기게 합니다.
각 러닝메이트는 하나의 미션과 산출물을 담당합니다. 이전 단계의 학습일지를 읽고 시작하므로, 9개를 거쳐도 하나의 연속된 프로젝트 경험이 됩니다.
러닝메이트는 큰 미션을 여러 소단계로 쪼개 학습자를 안내합니다. 소단계마다 완료 기준이 있고, 미완료 시 같은 소단계를 반복합니다.
"평소 정리하거나 기억하려 애쓰는 것이 있나요?"
"누가 쓰나요? 어떤 불편을 해결하나요?"
"첫 버전에서 꼭 되는 한 가지는 무엇인가요?"
대상·해결 문제·MVP를 목표서 형식으로 구조화
3요소 충족 여부 판정 → 학습일지 작성 → 저장
"오류 마지막 줄에서 어떤 단어가 보이나요?"
"new_rating에 들어가는 값은 숫자일까요, 문자일까요?"
학습자가 먼저 해결 방향을 말하게 함 (답 먼저 주지 않음)
학습자가 직접 int() 변환 적용 → 실행 결과 확인
오류·원인·시도·결과를 학습 기록으로 구조화 → 저장
부트스트랩은 한 줄로 이어지는 선형 단계이고, 코드가 나온 다음부터는 학습자의 말에 따라 러닝메이트를 골라 호출하는 실행 루프로 바뀝니다. 그리고 모든 단계는 학습일지로 연결됩니다.
"이제 마무리하고 싶어요" 입력 시 다음 구간으로어떤 러닝메이트를 만나든 흐름은 동일합니다. 이전 기록을 읽고, 미션을 수행하고, 완료를 판정한 뒤, 기록을 남기고 다음으로 넘어갑니다.
구조 설명만으로는 감이 안 올 수 있습니다. 그래서 한 학습자가 첫 프로젝트를 처음부터 끝까지 만드는 과정을 ①번부터 ⑨번 러닝메이트까지 따라가며, 실제로 오갈 법한 대화를 그대로 담았습니다.
"평점을 메모장에 흩어 적어둬서 평균을 모르겠다"는 비전공 입문자의 고민에서 출발합니다. 모든 대화는 이 하나의 프로젝트로 이어집니다.
아직 코드는 없습니다. "무엇을 왜 만드는지"를 명료화하고, 기능으로 쪼개고, AI에게 보낼 요청문까지 갖춘 뒤 첫 코드를 생성합니다.
그럼 "이번 학기에 본 영화를 기록하고 평점 통계를 보여주는 프로그램"을 첫 목표로 잡아볼까요? 만들기 전에 세 가지만 같이 정해요.
정확해요 — 그건 후순위로 빼둘게요. 마지막으로 입력과 출력을 정리하면 이래요.
이걸 "기능 명세서"로 저장했어요.
그 정보가 아주 중요해요. "입문자"라는 점, Colab(파이썬), 명세서의 기능, 그리고 "주석·단계별 설명·실행 방법을 함께 달아달라"는 요청까지 넣어 이렇게 정리했어요.
나는 파이썬을 거의 처음 다루는 입문자야. Google Colab에서 실행할 거야. 아래 기능을 가진 짧은 파이썬 프로그램을 만들어줘. - 영화 목록(제목, 평점 1~5)을 코드 안에 직접 넣는다 - 영화 수, 평균 평점, 평점 5점 영화 목록을 출력한다 요구사항: - 초보자가 읽도록 변수와 함수에 한국어 주석을 달아줘 - 코드가 무엇을 하는지 단계별로 짧게 설명해줘 - Colab에서 실행하는 방법도 알려줘
프롬프트대로 첫 버전을 만들었어요. Colab 새 노트에 붙여넣고 실행해보세요.
# 이번 학기에 본 영화 기록 & 평점 통계 movies = [ {"title": "인터스텔라", "rating": 5}, {"title": "라라랜드", "rating": 4}, {"title": "기생충", "rating": 5}, {"title": "어바웃 타임", "rating": 4}, ] # 평균 평점을 계산하는 함수 def average_rating(movie_list): total = 0 for movie in movie_list: total += movie["rating"] return total / len(movie_list) # 기준 점수 이상인 영화 제목만 모으는 함수 def top_movies(movie_list, min_rating=5): result = [] for movie in movie_list: if movie["rating"] >= min_rating: result.append(movie["title"]) return result print("기록한 영화 수:", len(movies)) print("평균 평점:", average_rating(movies)) print("평점 5점 영화:", top_movies(movies))
실행 방법: ① colab.research.google.com 접속 → ② 새 노트 만들기 → ③ 코드 붙여넣기 → ④ 셀 왼쪽 ▶ 버튼(또는 Shift+Enter). 실행하면 이렇게 나와요.
기록한 영화 수: 4 평균 평점: 4.5 평점 5점 영화: ['인터스텔라', '기생충']
실행해본 뒤 알려줄래요? "결과가 나왔다 / 오류가 났다 / 무슨 뜻인지 모르겠다" 중 무엇이든 괜찮아요.
이제부터는 정해진 순서가 없습니다. 학습자가 그냥 말하면, 인텐트 라우터가 의도를 읽고 알맞은 러닝메이트를 부릅니다.
total = 0 은 무슨 역할일 것 같아요?total += movie["rating"] 은요?return total / len(movie_list) 까지 합치면, 이 함수를 한 문장으로 어떻게 설명할 수 있을까요?영화를 직접 입력해서 추가하고 싶어서 이렇게 바꿨는데 오류가 나요.
new_title = input("영화 제목: ")
new_rating = input("평점(1~5): ")
movies.append({"title": new_title, "rating": new_rating})
print("평균 평점:", average_rating(movies))TypeError: unsupported operand type(s) for +=: 'int' and 'str'
int(input(...)) 처럼요.좋아요. 그 방향대로 바뀐 부분만 비교해볼게요.
def average_rating(movie_list):
total = 0
for movie in movie_list:
total += movie["rating"]
return total / len(movie_list)def average_rating(movie_list):
if not movie_list: # 목록이 비었으면
return 0 # 0을 돌려준다
total = sum(m["rating"] for m in movie_list)
return total / len(movie_list){"title": ..., "rating": ...} 처럼 쓰던데, 이 중괄호 묶음이 정확히 뭔지 모르겠어요. 딕셔너리라고 하던데.movie["rating"] 은 무엇을 하는 걸까요?학습자가 "끝낼래요"라고 말하면, 그동안 남긴 학습일지를 모아 하나의 포트폴리오로 통합합니다.
좋아요. 그동안의 기록을 바탕으로 포트폴리오 초안을 정리했어요.
미션을 완료할 때마다 학습일지가 Notion에 자동 기록됩니다. 앞에서 본 영화 프로젝트의 대화가 실제로 어떤 데이터로 남는지, 4개의 데이터베이스로 보여드립니다.
9개 러닝메이트가 미션을 끝낼 때마다 한 줄씩 자동으로 추가됩니다. 한 프로젝트의 학습 여정이 시간순으로 쌓입니다.
| Aa미션 | ◉러닝메이트 | ≣산출물 | ◉구간 | ≣다음 단계 요약 | 🗓생성일 |
|---|---|---|---|---|---|
🎯프로젝트 설계열기 ↗ | 프로젝트 설계 | 프로젝트 목표서 | 부트스트랩 | 기능 단위로 분해 | 2026/04/10 |
📋요구사항 분석열기 ↗ | 요구사항 분석 | 기능 명세서 | 부트스트랩 | 개발 프롬프트 작성 | 2026/04/10 |
✍️프롬프트 설계열기 ↗ | 프롬프트 설계 | 최종 개발 프롬프트 | 부트스트랩 | 코드 생성·실행 | 2026/04/11 |
🧩코드 생성 및 실행열기 ↗ | 코드 생성·실행 | 코드 + Colab 링크 | 부트스트랩 | 코드 이해 | 2026/04/11 |
🔍코드 이해열기 ↗ | 코드 이해 | 코드 자기설명 | 실행 루프 | 필요 시 디버깅 | 2026/04/12 |
🐞디버깅열기 ↗ | 디버깅 | 디버깅 로그 | 실행 루프 | 입력값 검증 | 2026/04/13 |
♻️리팩터링열기 ↗ | 리팩터링 | 개선 기록 | 실행 루프 | 파일 저장 | 2026/04/14 |
💡개념탐구 하브루타열기 ↗ | 개념탐구 | 딕셔너리 자기설명 | 실행 루프 | 계속 개발 | 2026/04/14 |
🏁프로젝트 회고열기 ↗ | 프로젝트 회고 | 프로젝트 포트폴리오 | 마무리 | 다음 프로젝트 | 2026/04/15 |
| + 새로 만들기 | |||||
표의 한 줄을 클릭하면 페이지가 열립니다. 기획서의 공통 구조(입력 요약·지원 내용·설명·다음 행동)가 그대로 본문이 됩니다.
input()으로 영화를 직접 추가하는 기능을 넣은 뒤, 평균 평점 계산에서 오류가 발생함.
TypeError: unsupported operand type(s) for +=: 'int' and 'str'
오류 메시지의 핵심 단어("int and str")를 직접 읽게 하고, "input()이 돌려주는 값의 자료형"을 묻는 질문으로 원인을 스스로 찾도록 유도함. 정답을 먼저 알려주지 않음.
input()은 사용자가 입력한 값을 문자열(str)로 돌려주기 때문에, 숫자 평점을 더하려면 int()로 변환해야 한다.
사용자가 숫자가 아닌 값을 입력했을 때의 처리(예외 처리)는 아직 안 됨.
학습일지와 별개로, 오류 기록과 AI 프롬프트도 각각의 DB에 정리됩니다. 같은 오류를 다시 만났을 때 바로 검색해 쓸 수 있습니다.
| Aa오류 유형 | ≣오류 메시지 | ≣원인 후보 | ≣해결 방법 | ◉해결 여부 | ≣학습한 점 |
|---|---|---|---|---|---|
🐞TypeError | unsupported operand 'int' and 'str' | input()이 문자열 반환 | int()로 변환 | 해결 | 화면 입력값은 문자열이다 |
🛡️ZeroDivisionError | division by zero (예방) | 빈 목록에서 len이 0 | 빈 목록 가드 추가 | 사전 예방 | 0으로 나누기를 미리 막는다 |
| + 새로 만들기 | |||||
| Aa프롬프트 목적 | ◉사용 AI 도구 | ≣결과 요약 | ≣개선할 점 |
|---|---|---|---|
🚀첫 버전 코드 생성 | ChatGPT | 영화 통계 코드 생성·실행 성공 | 입력값 검증 요청 누락 |
🔎코드 설명 요청 | ChatGPT | 함수 동작 단계별 설명 확보 | — |
| + 새로 만들기 | |||
모든 기록이 하나의 프로젝트로 묶입니다. 상태·기술스택·최종 포트폴리오 링크를 한곳에서 확인할 수 있습니다.
9개 러닝메이트는 저마다 다른 산출물을 만듭니다. 같은 학습일지여도 미션에 따라 내용이 완전히 달라집니다. Learning Journal DB에서 한 줄을 열면 나오는 페이지들을, 종류별로 모았습니다.
앞에서 본 그 프로젝트입니다. 설계부터 회고까지, 7개 미션이 어떻게 다른 일지로 남는지 순서대로 보세요.
"코딩으로 뭔가 만들고 싶은데 주제를 못 정하겠다"에서 시작. 평소 영화 평점을 메모장에 흩어 적던 불편을 주제로 잡음.
거창한 주제 대신 "평소 반복하거나 정리하는 일"에서 출발하도록 질문하고, 대상·문제·MVP 세 가지를 분리해 정리하도록 도움.
처음엔 다 만들려 했는데, "평균 평점 하나만 먼저 되게 하면 된다"는 걸 알았다.
입력 방법은 아직 미정. → 다음 미션: ② 요구사항 분석으로 기능을 쪼갠다.
목표서의 "영화 목록 → 평균 평점"을 더 작은 기능으로 나눔.
"꼭 해야 하는 일을 동사로" 묻고, 핵심 기능과 후순위 기능을 구분하도록 도움.
검색·저장은 나중에 해도 된다는 걸 알아서, 처음 만들 범위가 줄었다.
평점 범위(1~5) 외 형식 규칙은 미정. → 다음 미션: ③ 프롬프트 설계.
"영화 평점 프로그램 만들어줘"처럼 막연히 요청하면 원하는 결과가 안 나옴을 인지.
학습자 수준(입문자)·환경(Colab)·기능·출력 형식·설명 요청을 프롬프트에 넣도록 유도.
나는 파이썬을 거의 처음 다루는 입문자야. Google Colab에서 실행할 거야. 영화 목록(제목, 평점 1~5)을 코드 안에 직접 넣고, 영화 수 · 평균 평점 · 평점 5점 영화 목록을 출력하는 짧은 프로그램을 만들어줘. - 변수와 함수에 한국어 주석을 달아줘 - 코드가 무엇을 하는지 단계별로 짧게 설명해줘 - Colab에서 실행하는 방법도 알려줘
내 수준과 환경을 알려주면 AI가 더 맞는 코드를 준다는 걸 알았다.
입력값 검증 요청을 빠뜨림(나중에 오류로 이어짐). → 다음 미션: ④ 코드 생성 및 실행.
결과는 나왔지만 average_rating 함수의 동작이 이해되지 않음.
한 줄씩 무슨 역할인지 직접 말하도록 질문(정답을 먼저 알려주지 않음).
직접 한 줄씩 말로 설명하니 코드가 내 것처럼 느껴졌다.
top_movies의 min_rating 기본값이 왜 5인지는 더 봐야 함. → 필요 시 디버깅·리팩터링 호출.
영화가 0개일 때 평균 계산에서 오류가 날 것 같아 미리 고치고 싶음.
len이 0이면 무슨 일이 생기는지 묻고, 어디에 어떤 조건을 넣을지 학습자가 먼저 제안하게 함.
def average_rating(movie_list):
total = 0
for movie in movie_list:
total += movie["rating"]
return total / len(movie_list)def average_rating(movie_list):
if not movie_list: # 목록이 비었으면
return 0 # 0을 돌려준다
total = sum(m["rating"] for m in movie_list)
return total / len(movie_list)오류가 나기 전에 미리 막는 코드를 넣을 수 있다는 걸 배웠다.
평점이 1~5 범위를 벗어난 값은 아직 안 거름. → 다음 행동: 입력값 검증.
{"title": ..., "rating": ...} 묶음(딕셔너리)이 뭔지 모름.
정의를 먼저 주지 않고 "자기 말 정의 → 코드 적용 → 리스트와 비교"까지 질문으로 이어감.
딕셔너리 안에 또 딕셔너리를 넣는 경우는 아직 안 해봄. → 다음 행동: 계속 개발.
프로젝트를 마무리하고 싶음. 그동안의 학습일지를 모아 정리.
무엇을 만들었는지 한 문장으로 말하게 한 뒤, 그동안의 기록을 바탕으로 포트폴리오 초안을 작성.
코드를 받기만 한 게 아니라, 이해하고 고치고 설명까지 해냈다.
같은 러닝메이트라도 프로젝트가 다르면 일지 내용이 달라집니다. 도메인·오류·개념이 어떻게 바뀌는지 보세요.
회비를 "10,000"처럼 콤마가 들어간 형태로 입력받아 합계를 내려 하니 오류가 남.
ValueError: could not convert string to float: '10,000'
오류 메시지에서 변환에 실패한 값('10,000')을 직접 찾게 하고, 콤마가 숫자 변환을 막는다는 점을 스스로 추론하게 함.
"원"이나 공백이 함께 들어온 경우는 아직 처리 안 됨. → 다음 행동: 입력 정리(콤마·단위 제거) 함수 만들기.
단어들을 한 변수에 모아 random으로 뽑던데, 그 묶음(리스트)이 뭔지 궁금함.
자기 말 정의 → 코드 적용 → "딕셔너리와 뭐가 다른가" 비교까지 질문으로 이어감.
단어와 뜻을 함께 담으려면 어떻게 할지 모르겠음. → 다음 행동: 단어와 뜻을 딕셔너리로 묶어 리스트에 담기.