AI 러닝메이트 포트폴리오 신규 추가 · New
Overview · 신규 러닝메이트 소개

바이브코딩 러닝메이트 세트 개념 · 구성 · 동작 · 학습일지를 한 문서로 안내합니다

생성형 AI와 함께 프로젝트를 완주하는 미션형 학습 동반자가 무엇인지, 9종 러닝메이트가 어떻게 구성되고 동작하는지, 실제 대화 사례와 자동으로 쌓이는 노션 학습일지까지 차례로 살펴봅니다.

목차바로가기 · Contents

이 문서 한눈에 보기

제목을 누르면 해당 부분으로 바로 이동합니다.

AI러닝메이트 포트폴리오

질문에 답하는 챗봇이 아니라,
학습을 함께 거치는 AI 동반자.

학습자의 짧고 모호한 한마디 안에는 학업 · 진로 · 정서 · 제도 · 사고방식이 함께 들어 있습니다. AI 러닝메이트는 이를 분리해 단계형 대화로 전환하고, 상담 · 탐구 · 진단 · 성찰을 하나로 잇는 AI 학습지원 에이전트입니다.

구조화
막연한 고민을 문제로
짧은 표현을 학업 · 진로 · 제도 · 성향 · 실행계획 관점으로 나눠 상담 가능한 형태로 전환합니다.
사고 과정
정답이 아닌 질문으로
답을 바로 주기보다, 학생이 스스로 개념을 설명하고 주장 · 근거를 점검하도록 이끕니다. (하브루타)
연속성
상담·탐구·진단을 연결
상담 · 진로탐색 · 성향진단 · 탐구가 이어져 자기이해와 실행계획을 지속적으로 지원합니다.
러닝 프로파일 트윈

초개인화 엔진. 학생을 점수 하나가 아니라 학업이력 · 관심 · 성향 · 활동 · 상담 맥락으로 종합 이해하고, 학사 · LMS · 상담 · 비교과 데이터와 실시간으로 연결돼 상담의 깊이와 실행 가능성을 높입니다.

Portfolio상담 · 탐구 · 진단을 지원하는 6종 러닝메이트
  • 학습상담
  • 진로상담
  • 개념탐구 하브루타
  • 논증탐구 하브루타
  • 홀랜드 검사
  • MBTI 검사
  • + 바이브코딩 러닝메이트

이 포트폴리오에 새로 더해지는 7번째 러닝메이트바이브코딩 러닝메이트 세트입니다.

VIBE CODING LEARNING MATE SUITE

바이브코딩 러닝메이트 세트

생성형 AI와 함께 프로젝트를 완주하는 학습자를 위한 미션형 학습 동반자입니다. 코드를 대신 만드는 도구가 아니라, 무엇을 만들지 정의하고 · 실행하고 · 검증하고 · 디버깅하고 · 회고하는 과정을 길러줍니다.

9종
단계별 러닝메이트
3구간
부트스트랩 · 실행 루프 · 마무리
자동
미션 완료마다 학습일지 → Notion 저장
01무엇인가

코드를 대신 만들지 않습니다.
만드는 법을 익히게 합니다.

같은 "AI로 코딩하기"처럼 보여도 목표가 다릅니다. 범용 도구는 결과 코드를 빠르게 내놓고 끝나지만, 러닝메이트는 그 과정을 학습자가 직접 거치고 기록으로 남기게 합니다.

범용 AI 코딩 도구
  • 요청하면 코드를 대신 생성해 줌
  • 결과물만 남고 학습 과정은 사라짐
  • "왜 · 어떻게"는 학습자의 몫으로 방치
  • 오류가 나면 그대로 멈추거나 포기
바이브코딩 러닝메이트
  • 의도 명료화 → 실행 → 검증 → 디버깅 → 회고를 단계로 안내
  • 각 단계 산출물과 사고 과정을 학습일지로 보존
  • 코드를 자기 말로 설명하고 검증하게 함
  • 오류를 학습 자료로 전환(디버깅 로그)
핵심: 각 러닝메이트는 명확한 미션과 완료 기준을 갖고, 완료를 판정하며, 완료된 과정을 학습일지·포트폴리오로 남깁니다. 이 "검증 사고 + 학습 기록"이 범용 도구와의 차별점입니다.
02구성 · 9종 러닝메이트

한 프로젝트를 3구간 9개의 미션으로 따라갑니다.

각 러닝메이트는 하나의 미션과 산출물을 담당합니다. 이전 단계의 학습일지를 읽고 시작하므로, 9개를 거쳐도 하나의 연속된 프로젝트 경험이 됩니다.

Phase 1 · Bootstrap

부트스트랩 — 만들기 전 준비

선형 진행 · 순서대로 완료
프로젝트 설계
아이디어를 구체적 목표로. 대상 사용자·해결 문제·MVP 범위 정리.
산출물프로젝트 목표서
요구사항 분석
목표를 기능 단위로 분해. 핵심·후순위 기능, 입력·출력, 사용자 흐름.
산출물기능 명세서
프롬프트 설계
AI에 전달할 고품질 요청문. 기술스택·구현 범위·출력 형식 포함.
산출물최종 개발 프롬프트
코드 생성 및 실행
첫 버전 생성·실행. Colab/Replit 실행 환경 링크 함께 제공.
산출물실행 가능한 코드 + 실행 환경
Phase 2 · Execution Loop

실행 루프 — 막힐 때마다 호출

호출형 · 필요한 것을 반복 호출
코드 이해
생성된 코드의 목적·변수·함수·실행 흐름을 자기 말로 설명.
산출물코드 자기설명
디버깅
오류 메시지·원인 후보·수정 시도·결과를 정리하며 해결.
산출물디버깅 로그
리팩터링
개선 대상·이유·수정 전후를 비교하며 코드 품질 개선.
산출물개선 기록
개념탐구 하브루타
막힌 개념(API·JSON·함수 등)을 정의하고 내 프로젝트 속 역할로 설명.
산출물개념 자기설명
Phase 3 · Wrap-up

마무리 — 성장 자산으로 정리

프로젝트 종료 정리
프로젝트 회고
구현 기능·사용 기술·배운 개념·해결한 오류·AI 활용 전략·다음 목표를 정리.
산출물프로젝트 포트폴리오
03소단계 구조

미션 하나도 소단계로 구조화되어 있습니다.

러닝메이트는 큰 미션을 여러 소단계로 쪼개 학습자를 안내합니다. 소단계마다 완료 기준이 있고, 미완료 시 같은 소단계를 반복합니다.

Phase 1 · 부트스트랩
프로젝트 설계
미션: 아이디어를 대상·문제·MVP로 구조화할 수 있다
  1. 1
    아이디어 탐색

    "평소 정리하거나 기억하려 애쓰는 것이 있나요?"

  2. 2
    대상·문제 명료화

    "누가 쓰나요? 어떤 불편을 해결하나요?"

  3. 3
    MVP 범위 설정

    "첫 버전에서 꼭 되는 한 가지는 무엇인가요?"

  4. 4
    목표서 초안 작성

    대상·해결 문제·MVP를 목표서 형식으로 구조화

  5. 5
    완료 기준 확인

    3요소 충족 여부 판정 → 학습일지 작성 → 저장

산출물프로젝트 목표서
Phase 2 · 실행 루프
디버깅
미션: 오류 메시지를 스스로 읽고 원인을 추론하여 해결할 수 있다
  1. 1
    오류 메시지 읽기

    "오류 마지막 줄에서 어떤 단어가 보이나요?"

  2. 2
    원인 추론 유도

    "new_rating에 들어가는 값은 숫자일까요, 문자일까요?"

  3. 3
    수정 방향 제안

    학습자가 먼저 해결 방향을 말하게 함 (답 먼저 주지 않음)

  4. 4
    코드 수정 후 재실행

    학습자가 직접 int() 변환 적용 → 실행 결과 확인

  5. 5
    디버깅 로그 작성

    오류·원인·시도·결과를 학습 기록으로 구조화 → 저장

산출물디버깅 로그
소단계 원칙: 각 소단계는 학습자가 직접 답해야 다음으로 넘어갈 수 있으며, 마지막 소단계에서 완료 기준을 판정합니다. 기준을 충족하지 못하면 같은 소단계로 돌아가 반복합니다.
04전체 흐름

앞은 순서대로, 뒤는 필요할 때마다.

부트스트랩은 한 줄로 이어지는 선형 단계이고, 코드가 나온 다음부터는 학습자의 말에 따라 러닝메이트를 골라 호출하는 실행 루프로 바뀝니다. 그리고 모든 단계는 학습일지로 연결됩니다.

Phase 1 · 부트스트랩선형 · 완료해야 다음으로
프로젝트 설계
목표서
요구사항 분석
기능 명세서
프롬프트 설계
최종 프롬프트
코드 생성·실행
코드 + 실행 환경
코드가 실행되면 → 실행 루프 진입
Phase 2 · 실행 루프호출형 · 학습자 입력으로 분기
Intent Router
인텐트 라우터
학습자가 한 말의 의도를 읽고, 알맞은 러닝메이트를 호출합니다.
"이 코드 무슨 뜻이죠?"⑤ 코드 이해
"NameError가 나요."⑥ 디버깅
"더 깔끔하게 하고 싶어요."⑦ 리팩터링
"API가 뭔지 모르겠어요."⑧ 개념탐구
각 호출이 끝나면 다시 라우터로 돌아옵니다 · 종료 신호 "이제 마무리하고 싶어요" 입력 시 다음 구간으로
"이제 마무리하고 싶어요" → 회고
Phase 3 · 마무리정리 · 종료
프로젝트 회고
프로젝트 포트폴리오 완성
학습 기록모든 미션은 학습일지로 이어집니다
① 목표서 ② 명세서 ③ 프롬프트 ④ 코드 ⑤~⑧ 실행 루프 ⑨ 포트폴리오 Notion 자동 저장
05러닝메이트 한 개의 동작

9개 모두 같은 방식으로 움직입니다.

어떤 러닝메이트를 만나든 흐름은 동일합니다. 이전 기록을 읽고, 미션을 수행하고, 완료를 판정한 뒤, 기록을 남기고 다음으로 넘어갑니다.

학습일지 로드
이전 단계 산출물 읽기
미션 수행
소단계 대화로 진행
?
완료 판정
기준 충족 여부 "예/아니오"
학습일지 작성
과정·산출물 구조화
Notion 저장
다음 러닝메이트로 이동
미완료라면 — 같은 러닝메이트가 부족한 부분을 묻고, 다시 "미션 수행"으로 돌아갑니다.
DIALOGUE EXAMPLES

대화로 보는 바이브코딩 러닝메이트

구조 설명만으로는 감이 안 올 수 있습니다. 그래서 한 학습자가 첫 프로젝트를 처음부터 끝까지 만드는 과정을 ①번부터 ⑨번 러닝메이트까지 따라가며, 실제로 오갈 법한 대화를 그대로 담았습니다.

이 사례의 프로젝트

이번 학기에 본 영화 기록 & 평점 통계

"평점을 메모장에 흩어 적어둬서 평균을 모르겠다"는 비전공 입문자의 고민에서 출발합니다. 모든 대화는 이 하나의 프로젝트로 이어집니다.

PythonGoogle Colab리스트·딕셔너리함수
읽는 법
러닝메이트 — 질문으로 사고를 이끔
학습자 — 입문자의 실제 발화
해설
특징 해설 — 이 대화가 보여주는 것
Phase 1 · Bootstrap

부트스트랩 — 만들기 전 준비

선형 · 순서대로

아직 코드는 없습니다. "무엇을 왜 만드는지"를 명료화하고, 기능으로 쪼개고, AI에게 보낼 요청문까지 갖춘 뒤 첫 코드를 생성합니다.

프로젝트 설계
산출물 · 프로젝트 목표서
학습자
코딩으로 뭔가 만들어보고 싶은데, 막상 뭘 만들어야 할지 모르겠어요.
러닝메이트
좋아요. 거창한 주제보다 "내가 평소에 자꾸 정리하거나 기억하려 애쓰는 것"에서 시작하면 끝까지 만들기 쉬워요. 최근에 손으로 정리하거나 흩어진 채로 두고 있는 게 있나요? 예를 들면 가계부, 본 영화, 읽은 책, 운동 기록 같은 거요.
학습자
영화를 꽤 보는데, 평점을 그냥 메모장에 적어두기만 해서 정리가 안 돼요.
러닝메이트

그럼 "이번 학기에 본 영화를 기록하고 평점 통계를 보여주는 프로그램"을 첫 목표로 잡아볼까요? 만들기 전에 세 가지만 같이 정해요.

  • 누가 쓰나요?
  • 어떤 불편을 해결하나요?
  • 첫 버전에서 꼭 되는 한 가지는 뭔가요?
학습자
저 혼자 쓸 거고, 평점이 흩어져 있어서 평균이 몇 점인지 모르는 게 불편해요. 평균 평점만 나와도 좋겠어요.
러닝메이트
정리하면 — 대상: 나 / 해결 문제: 평점이 흩어져 평균을 모름 / MVP: 영화 목록을 넣으면 평균 평점을 보여주기. 이걸 "프로젝트 목표서"로 저장할게요. 다음은 이 목표를 기능 단위로 쪼개는 단계예요.
특징 해설 · 막연한 "뭔가 만들고 싶다"를 대상·문제·MVP로 구조화합니다. 코드 이야기를 꺼내기 전에 "무엇을 왜 만드는지"부터 명료화합니다.
요구사항 분석
산출물 · 기능 명세서
러닝메이트
목표서를 보면 "영화 목록 → 평균 평점"이 핵심이네요. 이걸 더 작은 기능으로 나눠볼게요. 프로그램이 꼭 해야 하는 일을 동사로 말해줄래요?
학습자
영화를 추가하고, 평점을 같이 적고, 평균을 계산하고, 결과를 보여줘요.
러닝메이트
그게 바로 핵심 기능이에요. 그럼 "있으면 좋지만 처음엔 없어도 되는" 기능은 뭐가 있을까요?
학습자
검색이나, 파일로 저장하는 거요. 처음엔 없어도 될 것 같아요.
러닝메이트

정확해요 — 그건 후순위로 빼둘게요. 마지막으로 입력과 출력을 정리하면 이래요.

  • 입력: 영화 제목, 평점(1~5)
  • 출력: 영화 수, 평균 평점, 평점 높은 영화
  • 사용자 흐름: 영화를 넣는다 → 실행한다 → 통계를 본다

이걸 "기능 명세서"로 저장했어요.

특징 해설 · 목표를 핵심·후순위 기능, 입력·출력, 사용자 흐름으로 분해합니다. 후순위를 따로 빼서 "처음부터 너무 크게 만들기"를 막습니다.
프롬프트 설계
산출물 · 최종 개발 프롬프트
러닝메이트
이제 AI에게 코드를 요청할 차례예요. 그냥 "영화 평점 프로그램 만들어줘"라고 하면 원하는 게 안 나와요. 같이 좋은 요청문을 만들어요. 어떤 환경에서 돌릴 거예요? 설치 없이 브라우저에서 하고 싶다면 Colab을 추천해요.
학습자
설치는 부담돼요. Colab으로 할게요. 그리고 파이썬은 거의 처음이에요.
러닝메이트

그 정보가 아주 중요해요. "입문자"라는 점, Colab(파이썬), 명세서의 기능, 그리고 "주석·단계별 설명·실행 방법을 함께 달아달라"는 요청까지 넣어 이렇게 정리했어요.

최종 개발 프롬프트
나는 파이썬을 거의 처음 다루는 입문자야. Google Colab에서 실행할 거야.
아래 기능을 가진 짧은 파이썬 프로그램을 만들어줘.
- 영화 목록(제목, 평점 1~5)을 코드 안에 직접 넣는다
- 영화 수, 평균 평점, 평점 5점 영화 목록을 출력한다

요구사항:
- 초보자가 읽도록 변수와 함수에 한국어 주석을 달아줘
- 코드가 무엇을 하는지 단계별로 짧게 설명해줘
- Colab에서 실행하는 방법도 알려줘
학습자
이대로 AI에 넣으면 되나요?
러닝메이트
네. 이 "최종 개발 프롬프트"를 저장하고, 다음 단계에서 실제 코드를 생성·실행해볼게요.
특징 해설 · 학습자 수준·환경·기능·출력 형식·설명 요청을 담은 프롬프트를 함께 설계합니다. "무엇을 어떻게 요청하는가"를 학습자가 직접 갖추게 합니다.
코드 생성 및 실행
산출물 · 실행 가능한 코드 + 실행 환경
러닝메이트

프롬프트대로 첫 버전을 만들었어요. Colab 새 노트에 붙여넣고 실행해보세요.

movie_stats.py
# 이번 학기에 본 영화 기록 & 평점 통계
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점 영화: ['인터스텔라', '기생충']

실행해본 뒤 알려줄래요? "결과가 나왔다 / 오류가 났다 / 무슨 뜻인지 모르겠다" 중 무엇이든 괜찮아요.

학습자
결과 나왔어요! 평균 평점 4.5요.
러닝메이트
잘했어요. 첫 버전이 돌아갔어요. 이제부터는 필요할 때마다 도와줄게요 — 코드 뜻이 궁금하면 설명을, 오류가 나면 같이 해결을, 개념이 막히면 탐구를 할 수 있어요. 이 코드와 실행 환경을 산출물로 저장했어요.
특징 해설 · 코드는 AI가 생성하되, 실행 환경 링크·실행 방법·다음 확인 질문을 함께 제공합니다. 여기서 "선형 단계(부트스트랩)"가 끝나고 "실행 루프"로 전환됩니다.
Phase 2 · Execution Loop

실행 루프 — 막힐 때마다 호출

호출형 · 반복

이제부터는 정해진 순서가 없습니다. 학습자가 그냥 말하면, 인텐트 라우터가 의도를 읽고 알맞은 러닝메이트를 부릅니다.

인텐트 라우터
학습자의 말 → 알맞은 러닝메이트
"이 함수 뭐 하는 거예요?"⑤ 코드 이해
"오류가 떴어요"⑥ 디버깅
"코드가 좀 지저분해요"⑦ 리팩터링
"딕셔너리가 뭐예요?"⑧ 개념탐구
학습자는 단계 이름을 몰라도 됩니다. 그냥 말하면 라우터가 알맞은 러닝메이트를 호출하고, 끝나면 다시 돌아옵니다.
코드 이해
산출물 · 코드 자기설명
학습자
결과는 봤는데, average_rating 함수가 정확히 뭘 하는지 모르겠어요.
러닝메이트
좋은 질문이에요. 제가 설명하기 전에 한 줄씩 같이 읽어볼게요. total = 0 은 무슨 역할일 것 같아요?
학습자
합계를 0부터 시작하는 거요?
러닝메이트
맞아요. 그럼 반복문 안의 total += movie["rating"] 은요?
학습자
영화 하나씩 돌면서 그 영화의 평점을 total에 더하는 거… 같아요.
러닝메이트
정확해요. 마지막 return total / len(movie_list) 까지 합치면, 이 함수를 한 문장으로 어떻게 설명할 수 있을까요?
학습자
모든 영화 평점을 더한 다음, 영화 수로 나눠서 평균을 돌려준다.
러닝메이트
완벽한 자기설명이에요. 방금 말한 걸 "코드 자기설명" 산출물로 저장할게요. 이렇게 직접 설명할 수 있으면 나중에 고치거나 확장할 때 훨씬 쉬워져요.
특징 해설 · 설명을 대신 해주지 않고 한 줄씩 질문해 학습자가 스스로 설명하게 합니다. 완료 기준(목적·변수·함수·흐름 중 2개 이상 자기 언어로 설명)을 충족합니다.
디버깅
산출물 · 디버깅 로그
학습자

영화를 직접 입력해서 추가하고 싶어서 이렇게 바꿨는데 오류가 나요.

내가 추가한 부분
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'
러닝메이트
같이 읽어봐요. 오류 메시지의 마지막 줄에서 어떤 단어가 보이나요?
학습자
"TypeError"랑 "int and str"요. 숫자랑 문자?
러닝메이트
맞아요. 평점을 더하는 곳에서 숫자(int)와 문자열(str)을 섞으려다 난 거예요. 그럼 new_rating에 들어가는 값은 숫자일까요, 문자일까요? input()이 돌려주는 게 무엇인지 떠올려봐요.
학습자
아… input은 문자열을 준다고 들었어요. 그래서 "4"가 들어간 거네요.
러닝메이트
바로 그거예요. 그럼 어떻게 고치면 될까요?
학습자
숫자로 바꿔야 하니까 int()를 쓰면 될 것 같아요. int(input(...)) 처럼요.
러닝메이트
맞아요. 그렇게 고치고 다시 실행해보세요.
학습자
됐어요! 평균 다시 잘 나와요.
러닝메이트
훌륭해요. 방금 과정을 "디버깅 로그"로 정리했어요 — 오류 메시지, 원인(input은 문자열 반환), 시도(int 변환), 결과(해결). 다음에 같은 오류를 만났을 때 큰 도움이 돼요.
특징 해설 · 답을 바로 고쳐주지 않고 오류 메시지 읽기 → 원인 추론 → 직접 수정의 순서로 유도합니다. 오류를 "디버깅 로그"라는 학습 자료로 바꿉니다.
학습일지미션 완료 시 이렇게 기록됩니다→ Notion 자동 저장
미션명디버깅
학습자 입력 요약input()으로 영화 추가 기능을 넣자 평균 계산에서 오류 발생
러닝메이트 지원오류 메시지 해석 유도, "input이 돌려주는 값" 질문으로 원인 추론 지원
완성된 산출물디버깅 로그 (TypeError · int+str)
학습자가 설명한 내용input()은 문자열을 반환하므로 int()로 변환해야 한다
남은 어려움숫자가 아닌 값을 입력했을 때의 처리
다음 행동입력값 검증 또는 파일 저장 기능 추가
리팩터링
산출물 · 개선 기록
학습자
코드가 잘 되긴 하는데, 영화가 하나도 없을 때 실행하면 또 오류가 날 것 같아요.
러닝메이트
날카로운 관찰이에요. 영화가 0개면 average_rating에서 무슨 일이 생길까요? total / len(movie_list)에서 len이 0이면요.
학습자
0으로 나누게 돼서… ZeroDivisionError요?
러닝메이트
맞아요. 그럼 "목록이 비었으면 평균을 0으로 돌려주기" 같은 안전장치를 넣으면 어떨까요? 어디에 어떤 조건을 넣으면 될지 먼저 말해볼래요?
학습자
함수 맨 위에서 목록이 비었는지 확인하고, 비었으면 0을 return해요.
러닝메이트

좋아요. 그 방향대로 바뀐 부분만 비교해볼게요.

Before · 빈 목록이면 오류
def average_rating(movie_list):
    total = 0
    for movie in movie_list:
        total += movie["rating"]
    return total / len(movie_list)
After · 안전장치 추가
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)
러닝메이트
개선 대상(빈 목록 처리), 이유(0으로 나누기 방지), 수정 전후 차이를 "개선 기록"으로 저장했어요.
특징 해설 · 학습자가 먼저 문제를 발견하고 해결 방향을 제안하게 합니다. 개선 대상·이유·전후 비교를 기록으로 남겨 "왜 고쳤는지"를 보존합니다.
개념탐구 하브루타
산출물 · 개념 자기설명
학습자
그런데 영화를 {"title": ..., "rating": ...} 처럼 쓰던데, 이 중괄호 묶음이 정확히 뭔지 모르겠어요. 딕셔너리라고 하던데.
러닝메이트
좋은 탐구 주제예요. 제가 정의하기 전에, 지금 코드를 보고 "딕셔너리"가 무엇인 것 같은지 본인 말로 설명해볼래요?
학습자
음… 제목이랑 평점을 한 묶음으로 짝지어서 저장하는 거? 이름표를 붙여서요.
러닝메이트
아주 좋아요. "이름표(키)로 값을 찾는 묶음"이라는 핵심을 잡았어요. 그럼 코드에서 movie["rating"] 은 무엇을 하는 걸까요?
학습자
"rating"이라는 이름표로 그 영화의 평점 값을 꺼내는 거요.
러닝메이트
정확해요. 한 가지 더 — 만약 딕셔너리 대신 제목 리스트와 평점 리스트를 따로 둔다면 어떤 점이 불편할까요?
학습자
제목이랑 평점이 순서로만 연결돼서, 하나가 어긋나면 짝이 틀어질 것 같아요. 딕셔너리는 이름표로 묶여 있어서 더 안전하고요.
러닝메이트
훌륭한 비교예요. 방금 정의와 프로젝트 적용을 "개념 자기설명"으로 저장할게요. 막힌 개념을 "내 코드 안에서" 이해했어요.
특징 해설 · 정답을 먼저 주지 않고 자기 언어 정의 → 코드 적용 → 한계 비교 순으로 질문합니다. 개념을 추상적으로가 아니라 "내 프로젝트 안에서" 이해하게 합니다.
Phase 3 · Wrap-up

마무리 — 성장 자산으로 정리

정리 · 종료

학습자가 "끝낼래요"라고 말하면, 그동안 남긴 학습일지를 모아 하나의 포트폴리오로 통합합니다.

프로젝트 회고
산출물 · 프로젝트 포트폴리오
학습자
이제 프로젝트를 마무리하고 싶어요.
러닝메이트
좋아요. 지금까지 남긴 학습일지를 모아 회고를 정리할게요. 먼저 본인 입으로, 이번에 무엇을 만들었나요? 한 문장이면 돼요.
학습자
영화 목록을 넣으면 평균 평점과 높은 평점 영화를 보여주는 프로그램이요.
러닝메이트

좋아요. 그동안의 기록을 바탕으로 포트폴리오 초안을 정리했어요.

프로젝트이번 학기 영화 기록 & 평점 통계
구현 기능영화 추가(입력), 평균 평점 계산, 평점 5점 영화 추출, 빈 목록 처리
사용 기술Python · 리스트/딕셔너리 · 함수 · 반복문/조건문 · Colab
배운 개념딕셔너리(이름표로 값 묶기), input은 문자열을 반환한다
해결한 오류TypeError(int+str) → int() 변환 / ZeroDivisionError 예방
AI 활용 전략수준·환경을 밝힌 프롬프트, 오류 메시지를 함께 읽고 원인 추론
다음 목표파일로 저장하기, 잘못된 입력값 검증
러닝메이트
이걸 "프로젝트 포트폴리오"로 저장하고 Notion에 최종 정리했어요. 첫 프로젝트를 끝까지 완주했어요 — 코드를 받기만 한 게 아니라, 이해하고 고치고 설명까지 해냈어요.
특징 해설 · 흩어진 학습일지를 하나의 포트폴리오로 통합합니다. 결과 코드뿐 아니라 "무엇을 어떻게 배웠는가"가 성장 자산으로 남습니다.
NOTION PORTFOLIO

노션에 쌓이는 학습 포트폴리오

미션을 완료할 때마다 학습일지가 Notion에 자동 기록됩니다. 앞에서 본 영화 프로젝트의 대화가 실제로 어떤 데이터로 남는지, 4개의 데이터베이스로 보여드립니다.

📓
Learning Journal DB
미션별 학습 과정 기록. 러닝메이트·미션·산출물·다음 단계.
★ 이 문서의 중심
🐞
Issue & Debug DB
오류와 해결 과정. 오류 유형·원인·해결 방법·학습한 점.
✍️
Prompt DB
AI에게 보낸 요청. 목적·최종 프롬프트·결과·개선점.
🗂️
Project DB
프로젝트 전체 현황. 상태·단계·기술스택·포트폴리오 링크.
1

Learning Journal DB

· 표 보기

9개 러닝메이트가 미션을 끝낼 때마다 한 줄씩 자동으로 추가됩니다. 한 프로젝트의 학습 여정이 시간순으로 쌓입니다.

notion.so/이서연/Learning-Journal
📓Learning Journal
미션 완료 시 러닝메이트가 자동 작성 · 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
+ 새로 만들기
계산 · 9개
2

학습일지 한 건을 열면

· 디버깅 기록

표의 한 줄을 클릭하면 페이지가 열립니다. 기획서의 공통 구조(입력 요약·지원 내용·설명·다음 행동)가 그대로 본문이 됩니다.

🐞디버깅 — input 추가 후 평균 계산 오류
러닝메이트
디버깅
구간
실행 루프
산출물
디버깅 로그
프로젝트
🎬 영화 평점 통계
상태
완료
🗓생성일
2026년 4월 13일
학습자 입력 요약

input()으로 영화를 직접 추가하는 기능을 넣은 뒤, 평균 평점 계산에서 오류가 발생함.

Error
TypeError: unsupported operand type(s) for +=: 'int' and 'str'
러닝메이트 지원 내용

오류 메시지의 핵심 단어("int and str")를 직접 읽게 하고, "input()이 돌려주는 값의 자료형"을 묻는 질문으로 원인을 스스로 찾도록 유도함. 정답을 먼저 알려주지 않음.

학습자가 설명한 내용

input()은 사용자가 입력한 값을 문자열(str)로 돌려주기 때문에, 숫자 평점을 더하려면 int()로 변환해야 한다.

💡핵심 정리 · 화면에서 받은 입력값은 항상 문자열이다. 숫자로 쓰려면 int() 또는 float()로 변환한다.
남은 어려움 / 후속 과제

사용자가 숫자가 아닌 값을 입력했을 때의 처리(예외 처리)는 아직 안 됨.

다음 행동
입력값이 1~5 사이 숫자인지 검증하는 코드 추가
영화 기록을 파일로 저장하기
3

함께 쌓이는 다른 DB

· Issue & Debug · Prompt

학습일지와 별개로, 오류 기록과 AI 프롬프트도 각각의 DB에 정리됩니다. 같은 오류를 다시 만났을 때 바로 검색해 쓸 수 있습니다.

🐞Issue & Debug
해결한 오류 기록 · 2개
Aa오류 유형 오류 메시지 원인 후보 해결 방법 해결 여부 학습한 점
🐞TypeError
unsupported operand 'int' and 'str'input()이 문자열 반환int()로 변환해결화면 입력값은 문자열이다
🛡️ZeroDivisionError
division by zero (예방)빈 목록에서 len이 0빈 목록 가드 추가사전 예방0으로 나누기를 미리 막는다
+ 새로 만들기
✍️Prompt
AI에게 보낸 요청 · 2개
Aa프롬프트 목적 사용 AI 도구 결과 요약 개선할 점
🚀첫 버전 코드 생성
ChatGPT영화 통계 코드 생성·실행 성공입력값 검증 요청 누락
🔎코드 설명 요청
ChatGPT함수 동작 단계별 설명 확보
+ 새로 만들기
4

프로젝트 전체 현황

· Project DB

모든 기록이 하나의 프로젝트로 묶입니다. 상태·기술스택·최종 포트폴리오 링크를 한곳에서 확인할 수 있습니다.

🎬영화 평점 통계
학습자
이서연
상태
완료
현재 단계
마무리
유형
데이터 분석
기술스택
Python · 리스트/딕셔너리 · 함수 · Colab
🗓기간
2026년 4월 10일 – 4월 15일
최종 포트폴리오
프로젝트 회고 페이지 열기 ↗
9
학습일지
2
해결한 오류
2
개념 자기설명
4.5
완성 결과 · 평균 평점
Project A

영화 평점 통계 프로젝트

앞에서 본 그 프로젝트입니다. 설계부터 회고까지, 7개 미션이 어떻게 다른 일지로 남는지 순서대로 보세요.

프로젝트 설계산출물 · 프로젝트 목표서
🎯프로젝트 설계 — 무엇을 만들지 정하기
러닝메이트
프로젝트 설계
구간
부트스트랩
상태
완료
🗓생성일
2026년 4월 10일
학습자 입력 요약

"코딩으로 뭔가 만들고 싶은데 주제를 못 정하겠다"에서 시작. 평소 영화 평점을 메모장에 흩어 적던 불편을 주제로 잡음.

러닝메이트 지원 내용

거창한 주제 대신 "평소 반복하거나 정리하는 일"에서 출발하도록 질문하고, 대상·문제·MVP 세 가지를 분리해 정리하도록 도움.

📎 산출물 · 프로젝트 목표서
프로젝트명영화 평점 통계
대상 사용자영화 평점을 흩어 적는 나 자신
해결 문제평점이 메모장에 흩어져 평균을 알 수 없음
기대 결과평균 평점과 인상 깊은 영화를 한눈에 확인
MVP 범위영화 목록을 넣으면 평균 평점을 계산해 출력
학습자가 설명한 내용

처음엔 다 만들려 했는데, "평균 평점 하나만 먼저 되게 하면 된다"는 걸 알았다.

남은 어려움 / 다음 미션

입력 방법은 아직 미정. → 다음 미션: ② 요구사항 분석으로 기능을 쪼갠다.

요구사항 분석산출물 · 기능 명세서
📋요구사항 분석 — 기능으로 쪼개기
러닝메이트
요구사항 분석
구간
부트스트랩
상태
완료
🗓생성일
2026년 4월 10일
학습자 입력 요약

목표서의 "영화 목록 → 평균 평점"을 더 작은 기능으로 나눔.

러닝메이트 지원 내용

"꼭 해야 하는 일을 동사로" 묻고, 핵심 기능과 후순위 기능을 구분하도록 도움.

📎 산출물 · 기능 명세서
핵심 기능영화 추가평점 기록평균 계산결과 출력
후순위 기능검색파일 저장
입력값영화 제목, 평점(1~5)
출력값영화 수, 평균 평점, 평점 높은 영화
사용자 흐름영화를 넣는다 → 실행한다 → 통계를 본다
학습자가 설명한 내용

검색·저장은 나중에 해도 된다는 걸 알아서, 처음 만들 범위가 줄었다.

남은 어려움 / 다음 미션

평점 범위(1~5) 외 형식 규칙은 미정. → 다음 미션: ③ 프롬프트 설계.

프롬프트 설계산출물 · 최종 개발 프롬프트
✍️프롬프트 설계 — AI에게 보낼 요청문
러닝메이트
프롬프트 설계
구간
부트스트랩
상태
완료
🗓생성일
2026년 4월 11일
학습자 입력 요약

"영화 평점 프로그램 만들어줘"처럼 막연히 요청하면 원하는 결과가 안 나옴을 인지.

러닝메이트 지원 내용

학습자 수준(입문자)·환경(Colab)·기능·출력 형식·설명 요청을 프롬프트에 넣도록 유도.

📎 산출물 · 최종 개발 프롬프트
기술스택Python · Google Colab
구현 범위영화 목록(코드 내장) → 영화 수·평균·평점 5점 목록 출력
출력 형식한국어 주석 + 단계별 설명 + 실행 방법
최종 프롬프트아래 코드 블록
Prompt
나는 파이썬을 거의 처음 다루는 입문자야. Google Colab에서 실행할 거야.
영화 목록(제목, 평점 1~5)을 코드 안에 직접 넣고,
영화 수 · 평균 평점 · 평점 5점 영화 목록을 출력하는 짧은 프로그램을 만들어줘.
- 변수와 함수에 한국어 주석을 달아줘
- 코드가 무엇을 하는지 단계별로 짧게 설명해줘
- Colab에서 실행하는 방법도 알려줘
학습자가 설명한 내용

내 수준과 환경을 알려주면 AI가 더 맞는 코드를 준다는 걸 알았다.

남은 어려움 / 다음 미션

입력값 검증 요청을 빠뜨림(나중에 오류로 이어짐). → 다음 미션: ④ 코드 생성 및 실행.

코드 이해산출물 · 코드 자기설명
🔍코드 이해 — average_rating 함수 설명
러닝메이트
코드 이해
구간
실행 루프
상태
완료
🗓생성일
2026년 4월 12일
학습자 입력 요약

결과는 나왔지만 average_rating 함수의 동작이 이해되지 않음.

러닝메이트 지원 내용

한 줄씩 무슨 역할인지 직접 말하도록 질문(정답을 먼저 알려주지 않음).

📎 산출물 · 코드 자기설명
코드 목적영화 평점들의 평균을 계산한다
핵심 변수total = 평점을 누적하는 합계 / movie["rating"] = 한 영화의 평점
핵심 함수average_rating(목록) → 평균 평점을 돌려준다
실행 흐름total을 0으로 시작 → 영화마다 평점을 더함 → 영화 수로 나눔 → 평균 반환
학습자가 설명한 내용

직접 한 줄씩 말로 설명하니 코드가 내 것처럼 느껴졌다.

남은 어려움 / 다음 행동

top_movies의 min_rating 기본값이 왜 5인지는 더 봐야 함. → 필요 시 디버깅·리팩터링 호출.

리팩터링산출물 · 개선 기록
♻️리팩터링 — 빈 목록 안전장치
러닝메이트
리팩터링
구간
실행 루프
상태
완료
🗓생성일
2026년 4월 14일
학습자 입력 요약

영화가 0개일 때 평균 계산에서 오류가 날 것 같아 미리 고치고 싶음.

러닝메이트 지원 내용

len이 0이면 무슨 일이 생기는지 묻고, 어디에 어떤 조건을 넣을지 학습자가 먼저 제안하게 함.

📎 산출물 · 개선 기록
개선 대상average_rating의 빈 목록 처리
개선 이유영화가 없으면 0으로 나눠 ZeroDivisionError 발생
Before · 빈 목록이면 오류
def average_rating(movie_list):
    total = 0
    for movie in movie_list:
        total += movie["rating"]
    return total / len(movie_list)
After · 안전장치 추가
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 범위를 벗어난 값은 아직 안 거름. → 다음 행동: 입력값 검증.

개념탐구 하브루타산출물 · 개념 자기설명
💡개념탐구 — 딕셔너리
러닝메이트
개념탐구
구간
실행 루프
탐구 개념
딕셔너리
🗓생성일
2026년 4월 14일
학습자 입력 요약

{"title": ..., "rating": ...} 묶음(딕셔너리)이 뭔지 모름.

러닝메이트 지원 내용

정의를 먼저 주지 않고 "자기 말 정의 → 코드 적용 → 리스트와 비교"까지 질문으로 이어감.

📎 산출물 · 개념 자기설명
개념 정의이름표(키)로 값을 찾는 묶음. 순서가 아니라 이름으로 꺼낸다.
프로젝트 적용영화 하나를 {"title":"기생충","rating":5}로 표현. movie["rating"]으로 평점을 꺼낸다.
비교로 점검제목·평점 리스트를 따로 두면 순서가 어긋날 위험. 딕셔너리는 이름으로 묶여 안전.
💡핵심 · 딕셔너리는 "이름표로 값을 찾는 묶음"이다.
남은 어려움 / 다음 행동

딕셔너리 안에 또 딕셔너리를 넣는 경우는 아직 안 해봄. → 다음 행동: 계속 개발.

프로젝트 회고산출물 · 프로젝트 포트폴리오
🏁프로젝트 회고 — 영화 평점 통계 포트폴리오
러닝메이트
프로젝트 회고
구간
마무리
상태
완료
🗓생성일
2026년 4월 15일
학습자 입력 요약

프로젝트를 마무리하고 싶음. 그동안의 학습일지를 모아 정리.

러닝메이트 지원 내용

무엇을 만들었는지 한 문장으로 말하게 한 뒤, 그동안의 기록을 바탕으로 포트폴리오 초안을 작성.

📎 산출물 · 프로젝트 포트폴리오
구현 기능영화 추가(입력), 평균 평점 계산, 평점 5점 영화 추출, 빈 목록 처리
사용 기술Python · 리스트/딕셔너리 · 함수 · 반복문/조건문 · Colab
배운 개념딕셔너리(이름표로 값 묶기), input은 문자열을 반환한다
해결한 오류TypeError(int+str) → int() 변환 / ZeroDivisionError 예방
AI 활용 전략수준·환경을 밝힌 프롬프트, 오류 메시지를 함께 읽고 원인 추론
다음 목표파일로 저장하기, 입력값 검증, 다음엔 웹 화면으로
학습자가 설명한 내용

코드를 받기만 한 게 아니라, 이해하고 고치고 설명까지 해냈다.

🔗연결 · 이 포트폴리오가 Project DB의 "최종 포트폴리오 링크"로 연결됩니다.
Project B · C

다른 프로젝트에서는

같은 러닝메이트라도 프로젝트가 다르면 일지 내용이 달라집니다. 도메인·오류·개념이 어떻게 바뀌는지 보세요.

디버깅산출물 · 디버깅 로그
🐞디버깅 — 회비 합계에서 ValueError
러닝메이트
디버깅
구간
실행 루프
프로젝트
💰 동아리 회비 정산기
🗓생성일
2026년 5월 2일
학습자 입력 요약

회비를 "10,000"처럼 콤마가 들어간 형태로 입력받아 합계를 내려 하니 오류가 남.

Error
ValueError: could not convert string to float: '10,000'
러닝메이트 지원 내용

오류 메시지에서 변환에 실패한 값('10,000')을 직접 찾게 하고, 콤마가 숫자 변환을 막는다는 점을 스스로 추론하게 함.

📎 산출물 · 디버깅 로그
오류 유형ValueError
발생 상황콤마가 포함된 금액 문자열을 float()로 변환할 때
원인 후보"10,000"의 콤마가 숫자 변환을 막음
수정 시도변환 전에 .replace(",", "")로 콤마 제거
결과해결 — 합계가 정상 계산됨
💡핵심 · 숫자처럼 보여도 콤마·"원" 같은 글자가 섞이면, 변환하기 전에 먼저 제거해야 한다.
남은 어려움 / 다음 행동

"원"이나 공백이 함께 들어온 경우는 아직 처리 안 됨. → 다음 행동: 입력 정리(콤마·단위 제거) 함수 만들기.

개념탐구 하브루타산출물 · 개념 자기설명
💡개념탐구 — 리스트
러닝메이트
개념탐구
구간
실행 루프
프로젝트
🤖 단어 퀴즈 챗봇
탐구 개념
리스트
학습자 입력 요약

단어들을 한 변수에 모아 random으로 뽑던데, 그 묶음(리스트)이 뭔지 궁금함.

러닝메이트 지원 내용

자기 말 정의 → 코드 적용 → "딕셔너리와 뭐가 다른가" 비교까지 질문으로 이어감.

📎 산출물 · 개념 자기설명
개념 정의여러 값을 순서대로 담는 묶음. 번호(인덱스)로 꺼낸다.
프로젝트 적용words = ["apple", "banana", "cherry"] 에서 random.choice(words)로 무작위 단어를 뽑는다.
비교로 점검딕셔너리는 이름표로, 리스트는 순서(번호)로 값을 찾는다.
💡핵심 · 리스트는 "순서대로 줄 세운 값들"이다.
남은 어려움 / 다음 행동

단어와 뜻을 함께 담으려면 어떻게 할지 모르겠음. → 다음 행동: 단어와 뜻을 딕셔너리로 묶어 리스트에 담기.