
생성 수정
IBM * 레드햇 AX 과정 · 4강
AI는 어디에서 동작하는가 — 서버 실습으로 확인하기
2026년 5월 4일(월) ~ 5월 8일(금)
6. AI는 지금 어디에 있는가
6.1 생성형 AI와 에이전틱 AI
AI는 현재 두 갈래로 이야기됩니다. 축 4입니다.
| 생성형 AI (Generative AI) | 에이전틱 AI (Agentic AI) | |
|---|---|---|
| 하는 일 | 요청받은 것을 만들어 냄 | 목표를 받고 스스로 계획하고 도구를 쓰며 반복 |
| 사람의 역할 | 매번 지시함 | 목표와 경계를 정해줌 |
| 끝나는 시점 | 한 번 응답하면 끝 | 목표 달성까지 여러 턴 |
| 판단의 주체 | 사람 | AI가 다음 행동을 정함 |
| 예 | 글·이미지 생성 | 코드 에이전트, 워크플로 자동화 |
"생성형 AI 시대는 저물고, 2026년은 에이전틱 AI 시대의 원년" — 이 주의 읽을거리에 나온 진단입니다. 모델이 무엇을 만들어 내느냐보다, 모델에게 어디까지 맡길 것이냐가 질문이 되었다는 뜻입니다.
6.2 어플과 에이전트 — 수동형과 추론형
같은 축을 소프트웨어 쪽에서 부른 이름입니다.
| 어플 (Application) | 에이전트 (Agent) | |
|---|---|---|
| 성격 | 수동형 | 추론형 |
| 동작 | 정해진 버튼을 누르면 정해진 결과 | 상황을 판단해 다음 행동을 스스로 정함 |
| 실패했을 때 | 에러를 띄우고 멈춤 | 다른 방법을 시도 |
| 결과의 예측 | 항상 같음 | 매번 다를 수 있음 |
어원: agent 는 라틴어 agere(행하다)에서 왔습니다. agency(대리·주체성)와 같은 뿌리입니다.
행하는 자 — 단어 자체가 "스스로 움직이는 쪽"이라는 뜻입니다.
⭐ 3.6절의 주체/객체 축과 이어집니다. 지금까지 프로그램은 사람이 다루는 오브젝트(수동) 였습니다. 에이전트는 그 프로그램이 서브젝트(능동) 쪽으로 넘어오는 현상입니다. 그래서 "어디까지 맡길 것인가"라는 질문이 기술 문제가 아니라 권한과 책임의 문제가 됩니다.
6.3 노코딩 — 코드 없이 .md 로 코딩하는 것
노코딩이란 코드가 없이 .md(마크다운)로 코딩하는 것입니다.
⚠️ 오해하기 쉬운데, 코드가 사라진다는 뜻이 아닙니다.
- 사람이 코드 문법을 직접 타이핑하지 않는다는 뜻입니다.
- 대신 자연어와 마크다운으로 의도와 규칙을 적고, 그것을 AI가 코드로 옮깁니다.
- 그래서
.md파일이 사실상 소스코드의 자리를 대신합니다.
이번 주에 실제로 그렇게 했습니다.
FastAPI 초기화 상태를 Cursor가 기억하도록 MD 파일로 저장했습니다(7.5절).
그 .md 파일이 "이 프로젝트는 이렇게 초기화되어 있다"는 규칙 문서이자 재현 가능한 지시서입니다.
이번 주에 쓴 두 에디터
| 도구 | 성격 | 무엇을 편집하나 |
|---|---|---|
| Cursor | 에디터 (IDE) | 코드 + AI 대화 |
| Obsidian | 에디터 | 마크다운 문서 |
둘 다 "에디터"인데 다루는 대상이 다릅니다. 그리고 노코딩 관점에서는 둘 다 소스를 편집하는 도구입니다.
⚠️ 노코드 툴과는 다릅니다.
플러터플로우(FlutterFlow) 같은 노코드 툴은 GUI에서 부품을 드래그로 조립합니다.
여기서 말하는 노코딩은 자연어와 .md 로 지시하는 방식입니다. 결과물의 소유 형태도 다릅니다.
앞으로 다시 만납니다 3주차 이후
CLAUDE.md같은 지침 파일이 본격적으로 등장합니다. 왜 하필.md인가 — 사람도 읽고 기계도 파싱하기 쉬운, 구조가 있는 최소한의 표기이기 때문입니다. (2.5절의 "리터럴이 구조를 만든다"와 같은 이야기입니다.)
6.4 MVP — 가장 작게 만들어 확인하기
MVP (Minimum Viable Product · 최소 기능 제품) — [제품 개발 전략]인데, [핵심 가치를 검증할 수 있는 최소한만 만들어 먼저 내보낸다]는 점에서 완성품 개발과 구별된다.
이번 주에 우리가 한 일이 정확히 MVP의 모양입니다.
- 화면도 없고, DB도 없고, 로그인도 없습니다.
- 오직 "요청하면 타이타닉 데이터 한 줄이 JSON으로 나온다" 하나만 됩니다.
- 그런데 그것만으로 "스크립트가 서버가 되었다" 는 사실은 완전히 검증됩니다.
⭐ 검증하려는 가설이 무엇인지를 먼저 정하고, 그 가설만 확인할 최소 크기를 만드는 것이 MVP입니다. "기능이 적은 것"이 아니라 "확인할 것이 분명한 것" 입니다.
7. 실습 — 이번 주에 손으로 한 것
7.1 Cursor 준비
① 상태 바(Status Bar)를 항상 열어두기 지금 어떤 파이썬 인터프리터(가상환경)를 쓰고 있는지가 항상 보이게 해둡니다. 이 한 줄이 안 보이면 "설치했는데 왜 import가 안 되지?"의 원인을 찾는 데 몇 시간이 걸립니다.
② import에 노란 줄이 그어질 때 노란 줄은 '그 이름을 못 찾겠다' 는 뜻입니다. 해당 위치의 퀵픽스(Quick Fix)를 클릭하면 자동으로 수정되는 경우가 많습니다.
원인은 대개 셋 중 하나입니다.
| 원인 | 확인 방법 |
|---|---|
| 패키지가 설치 안 됨 | pip list 에 있는지 |
| 인터프리터가 다른 환경을 가리킴 | 상태 바에서 .venv 가 선택돼 있는지 |
| 경로·철자 오타 | 파일명·모듈명 대소문자 |
7.2 깃허브에 코드 올리기 — 명령어는 세 줄뿐
git add .
git commit -m "제임스를 메인으로 세우다"
git push
| 명령 | 하는 일 | 비유 |
|---|---|---|
git add . | 변경된 파일을 무대에 올림(staging) | 사진 찍을 사람들을 모으기 |
git commit -m "..." | 지금 상태를 메시지와 함께 기록 | 셔터를 누르기 |
git push | 로컬 기록을 원격(깃허브)에 올림 | 앨범을 인터넷에 올리기 |
💡 커밋 메시지는 "무엇을 왜" 를 적습니다. 한국어로 써도 됩니다.
"제임스를 메인으로 세우다" 처럼 그 변경의 의미가 드러나면 좋은 메시지입니다.
⚠️ git add . 의 점(.)은 현재 폴더 이하 전부라는 뜻입니다.
올리면 안 되는 것(키 파일, 큰 데이터)이 섞이지 않는지 git status 로 먼저 확인하는 습관을 들이세요.
7.3 가상환경 만들고 FastAPI · Uvicorn 설치하기
모노레포 표준 방식: 루트에 .venv 하나만 두고, 의존성은 루트 requirements.txt로만 관리합니다.
모든 앱이 이 루트 환경을 공통으로 씁니다.
PowerShell 실행 순서
cd C:\Users\me\Documents\example-cloud
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install fastapi "uvicorn[standard]" pandas
pip freeze > requirements.txt
| 줄 | 하는 일 |
|---|---|
cd ... | 프로젝트 루트로 이동 |
python -m venv .venv | 이 폴더 안에 전용 주방 도구 세트 생성 |
.\.venv\Scripts\Activate.ps1 | 그 도구 세트를 활성화 |
python -m pip install --upgrade pip | pip 자체를 최신으로 |
pip install fastapi "uvicorn[standard]" pandas | 필요한 도구 설치 |
pip freeze > requirements.txt | 설치된 것들의 목록을 파일로 기록 |
💡 uvicorn[standard] 의 대괄호는 무엇인가
대괄호는 추가 옵션 묶음(extras) 입니다. 성능·기능을 위한 부가 패키지까지 함께 설치하라는 뜻입니다.
따옴표로 감싸는 이유: PowerShell에서 대괄호가 특수문자로 해석될 수 있기 때문입니다.
실행 정책 때문에 활성화가 막힌다면 — 그 세션에서만
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv\Scripts\Activate.ps1
⭐ -Scope Process 는 지금 이 창에서만 이라는 뜻입니다. 창을 닫으면 원래대로 돌아옵니다.
시스템 보안 설정을 영구히 바꾸지 않는, 가장 안전한 임시 조치입니다.
고정 규칙 네 가지 — 이걸 지키면 환경 문제의 90%가 사라집니다.
- 터미널을 열면 항상 루트로 이동 후
.venv활성화 - 패키지 추가는 루트에서만
- 변경 후에는 항상
pip freeze > requirements.txt - 다른 PC·CI도
pip install -r requirements.txt한 줄로 동일 환경
⚠️ conda 환경과 python -m venv 는 다릅니다.
| conda 환경 | python -m venv | |
|---|---|---|
| 어디에 만들어지나 | 아나콘다가 관리하는 중앙 폴더 | 프로젝트 폴더 안 .venv |
| 관리 도구 | conda | pip |
| 활성화 | conda activate venv | .\.venv\Scripts\Activate.ps1 |
둘을 섞어 쓰면 "분명 설치했는데 import가 안 되는" 현상이 생깁니다. 지금 어떤 환경이 활성인지 항상 이 한 줄로 확인하세요.
python -c "import sys; print(sys.executable)"
7.4 PowerShell 프로필로 자동화하기
"터미널을 열면 항상 루트로 이동 후 .venv 활성화"를 한 번만 설정해두고 잊는 방법입니다.
프로필(Profile) 은 터미널을 열 때마다 자동 실행되는 내 전용 시작 스크립트입니다.
# 1) 프로필 파일 경로 확인
$PROFILE
# 2) 프로필 폴더 생성(없으면)
New-Item -ItemType Directory -Force (Split-Path $PROFILE)
# 3) 프로필 파일 생성(없으면)
New-Item -ItemType File -Force $PROFILE
# 4) 프로필 편집
notepad $PROFILE
메모장이 열리면 아래를 추가합니다.
Set-Location "C:\Users\me\Documents\example-cloud"
if (Test-Path ".\.venv\Scripts\Activate.ps1") {
. ".\.venv\Scripts\Activate.ps1"
}
💡 세 번째 줄 맨 앞의 점(.)은 오타가 아닙니다.
닷 소싱(dot sourcing) 이라고 합니다. 스크립트를 별도 프로세스가 아니라 현재 세션 안에서 실행하라는 뜻입니다.
이렇게 해야 활성화 효과가 지금 이 창에 남습니다. 점을 빼면 활성화되었다가 곧바로 사라집니다.
💡 if (Test-Path ...) 로 감싼 이유: .venv 가 아직 없는 상태에서도 터미널이 에러 없이 열리게 하기 위함입니다.
실행 정책 오류가 나면 관리자 PowerShell에서 딱 한 번
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
확인 방법: 새 창을 열어서
Get-Location
python -c "import sys; print(sys.executable)"
Get-Location 이 루트를 가리키고, sys.executable 이 .venv 아래를 가리키면 성공입니다.
7.5 FastAPI 초기화하고, 그 상태를 MD로 남기기
Cursor가 기억하도록 MD로 저장하는 프롬프트 — 요구 사항은 셋입니다.
app = FastAPI(title="Titanic (James)")- 루트
/는{"message": "FAST API 초기화 성공", "docs": "/docs"}를 반환 uvicorn으로james:app을host="127.0.0.1", port=8000, reload=True로 실행
결과 코드
from fastapi import FastAPI
app = FastAPI(title="Titanic (James)")
@app.get("/")
def root():
return {"message": "FAST API 초기화 성공", "docs": "/docs"}
import uvicorn
uvicorn.run("james:app", host="127.0.0.1", port=8000, reload=True)
💡 james:app 을 읽는 법 — 모듈이름:객체이름 입니다.
- 콜론 왼쪽 = 파일 (
james.py) - 콜론 오른쪽 = 그 파일 안의 FastAPI 인스턴스 (
app)
uvicorn 은 이 표기를 보고 파일을 찾아 열고, 그 안의 app 이라는 객체를 꺼내 띄웁니다.
축 1(진입점을 누가 잡는가)이 문자열 한 줄에 그대로 드러나 있습니다.
💡 reload=True — 파일이 바뀌면 서버가 자동으로 재시작합니다. 개발용입니다. 프로덕션에서는 끕니다.
왜 이 상태를 .md 로 저장하는가
새 대화를 시작하면 AI는 이전 대화를 모릅니다.
.md 로 남겨두면 "이 프로젝트는 이렇게 초기화되어 있다" 를 매번 다시 읽힐 수 있습니다.
6.3절의 노코딩이 실제로 작동하는 방식입니다.
7.6 서버 새로고침 — 캐시가 남았을 때
taskkill /F /IM python.exe
python -m uvicorn main:app --reload --host 127.0.0.1 --port 8000 --app-dir "C:\Users\me\Documents\example-cloud\apps"
| 조각 | 뜻 |
|---|---|
taskkill | 실행 중인 프로세스를 종료 |
/F | 강제(Force) 종료 |
/IM python.exe | 이미지 이름(프로세스 이름) 기준으로 지정 |
python -m uvicorn | 파이썬 모듈로서 uvicorn 실행 (환경이 확실해짐) |
--reload | 파일이 바뀌면 자동 재시작 |
--host 127.0.0.1 --port 8000 | 어느 주소·어느 문으로 열지 |
--app-dir "..." | 앱 모듈을 찾을 기준 폴더 지정 |
⚠️ taskkill /F /IM python.exe 는 이 컴퓨터의 모든 파이썬 프로세스를 끕니다.
다른 파이썬 작업이 돌고 있으면 그것도 함께 죽습니다. 쓰기 전에 한 번 확인하세요.
💡 --app-dir 이 필요한 이유: 모노레포에서는 main.py 가 루트가 아니라 apps/ 아래에 있습니다.
uvicorn에게 "모듈을 여기서 찾아라"라고 알려주지 않으면 main 을 못 찾습니다.
언제 이 절차를 쓰나
--reload를 켜뒀는데도 코드 변경이 반영되지 않을 때- 포트 8000이 이미 사용 중이라는 에러가 날 때
7.7 의존성 설치 — 다른 환경에서 그대로 재현하기
conda activate venv
pip install -r requirements.txt
여기서의 '의존성'은 requirements.txt 쪽 의미입니다(4.6절 표 참고). DI가 아닙니다.
⭐ 이 두 줄이 "다른 컴퓨터에서도 똑같이 돌아간다" 는 약속을 실현합니다. 6단계의 "주방 도구 목록"이 여기서 값을 합니다.
7.8 자주 만나는 에러와 대응
| 증상 | 원인 | 대응 |
|---|---|---|
[Errno 10048] address already in use | 이전 서버가 안 죽음 | taskkill 후 재시작하거나 포트를 바꿈 |
ModuleNotFoundError: No module named 'main' | 실행 위치와 모듈 경로 불일치 | --app-dir 지정 |
ImportError: cannot import name 'app' | 객체 이름이 다름 | 모듈:객체 표기 확인 |
브라우저에서 404 | 라우트 경로 오타 | /docs 에서 실제 경로 확인 |
| import에 노란 줄 | 인터프리터가 다른 환경 | 상태 바에서 .venv 선택 |
Activate.ps1 실행 거부 | PowerShell 실행 정책 | -Scope Process 로 임시 우회 |
| 설치했는데 import 실패 | conda 환경과 .venv 혼용 | sys.executable 로 현재 환경 확인 |
| CSV를 못 찾음 | 상대 경로 + cwd 문제 | Path(__file__).resolve().parent 사용 |
⭐ 에러 메시지를 먼저 읽으세요. 위 표의 대부분은 메시지가 원인을 이미 말하고 있습니다.
No module named 'main' 은 "main을 못 찾겠다"이지, "코드가 틀렸다"가 아닙니다.
7.9 포스트맨(Postman) 설치와 첫 요청
설치
https://www.postman.com/downloads/→ Windows x64 다운로드 후 설치
첫 요청 만들기
- 좌측
COLLECTIONS옆+→ 드롭다운에서HTTP선택 Untitled Request이름을titanic으로 변경- 메서드
GET, URLhttp://localhost:8000/titanic/data입력 후Send
응답 확인
- 상태:
200 OK - Body를
JSON으로 보면 이런 형태입니다.
{
"PassengerId": 2,
"Survived": 1,
"Pclass": 1,
"Name": "Cumings, Mrs. John Bradley (Florence Briggs Thayer)",
"Sex": "female",
"Age": 38.0,
"SibSp": 1,
"Parch": 0,
"Ticket": "PC 17599",
"Fare": 71.2833,
"Cabin": "C85",
"Embarked": "C"
}
왜 브라우저 대신 포스트맨을 쓰는가
| 브라우저 | 포스트맨 | |
|---|---|---|
GET | 가능 | 가능 |
POST/PUT/DELETE | 불편 | 쉬움 |
| 헤더·인증 토큰 붙이기 | 어려움 | 쉬움 |
| 요청 저장·재사용 | 안 됨 | 컬렉션으로 저장 |
⭐ 이 순간이 이 주의 결승점입니다. 화면(프론트엔드)이 하나도 없는데도 백엔드가 제대로 동작하는지 확인되었습니다. 서버와 화면이 분리되어 있다는 것이 무슨 뜻인지 몸으로 아는 자리입니다.
응답에 나온 타이타닉 컬럼의 뜻
| 컬럼 | 뜻 |
|---|---|
PassengerId | 승객 번호 |
Survived | 생존 여부 (0 = 사망, 1 = 생존) |
Pclass | 객실 등급 (1 / 2 / 3) |
Name | 이름 |
Sex | 성별 |
Age | 나이 |
SibSp | 동승한 형제자매·배우자 수 |
Parch | 동승한 부모·자녀 수 |
Ticket | 티켓 번호 |
Fare | 요금 |
Cabin | 객실 번호 |
Embarked | 탑승 항구 (C / Q / S) |
💡 Survived 가 0 아니면 1인 것 — 이것이 이진 분류(Binary Classification) 문제의 모양입니다.
그리고 Age, Cabin 에는 빈 칸(결측치)이 많습니다. 데이터는 원래 깨끗하지 않습니다.
7.10 v0.app 으로 UI 구현하기
백엔드가 되었으니 이제 화면입니다.
접속과 로그인
v0.app접속 → 우측 상단Sign In
붙여 넣을 상세 스펙
공통 조건
- Next.js 14 App Router,
"use client", TypeScript, Tailwind만 사용 - 단일 파일 컴포넌트
TitanicQaApp - 화이트 계열 배경 + 아웃라인 버튼
메인 뷰 TitanicQAPage
- 제목
"Titanic QA Assistant", 서브"타이타닉 데이터 기반 질의응답" - 채팅 상태:
messages[] { role: "user" | "assistant", text, ts } - 입력 placeholder
"예: 25세 남성 3등석 생존 가능성은?",maxLength 500 - 빈 문자열 전송 금지, Enter 전송 / Shift+Enter 줄바꿈
- 전송 버튼은 lucide-react 의
Send아이콘 isLoading스피너,errorMessage+ 재시도 버튼- 요청:
POST {apiBaseUrl}/titanic/qa, JSON{ question } - 응답:
{ answer, confidence, sources }
보조 뷰 TitanicSampleDataPage
- 요청:
GET {apiBaseUrl}/titanic/data - 배열을 카드 리스트로 표시
API 주소 처리
apiBaseUrl기본값"http://127.0.0.1:8000"process.env.NEXT_PUBLIC_API_BASE_URL이 있으면 그것을 우선
스타일
- 말풍선
rounded-2xl - user는 오른쪽 + 강조색, assistant는 왼쪽 + 중립색
max-w-lg mx-autodark:다크모드 대응
배포하기
- 생성 후 우측 상단
Publish - Production Deployment 가 Initializing → Building → Updated 로 진행
도메인 연결
Settings→Domains- Default Domain 지정 후
Save Connected Domains의Add→ 도메인 입력Connect to an environment=Production선택 →Save- 다음 화면에서
GOT IT클릭
⭐
apiBaseUrl이 이 실습의 핵심입니다. 프론트엔드가 백엔드 주소를 변수로 들고 있습니다. 로컬에서는127.0.0.1:8000, 배포하면 진짜 도메인. 주소만 바꾸면 같은 화면이 다른 서버를 봅니다. 5.1절의example-com ↔ example-md가 코드 한 줄로 구현된 자리입니다.
⚠️ 프론트만 배포하면 다른 사람 화면에는 데이터가 안 옵니다.
백엔드가 아직 127.0.0.1(내 컴퓨터) 이기 때문입니다. 백엔드도 배포해야 연결이 완성됩니다.
💡 프롬프트가 왜 이렇게 긴가 "채팅 화면 만들어줘"라고 하면 매번 다른 게 나옵니다. 역할 / 기술 스택 / 데이터 구조 / 상태 / UI 구성 / 스타일 / 파일 출력 을 못 박을수록 결과가 재현 가능해집니다. 이것이 사양서 형식의 프롬프트입니다.
앞으로 다시 만납니다 프론트가 백엔드를 실제로 부르기 시작하면 CORS(다른 출처의 요청을 허용할지 정하는 브라우저 규칙)와 Axios(프론트에서 HTTP 요청을 보내는 도구), 그리고 배포 환경변수 문제가 나옵니다. 3주차의 주제입니다.
7.11 공공데이터 다뤄보기
- 공공데이터 포털 — 교통사고 데이터 다운로드 🔗 https://www.data.go.kr/data/15045638/fileData.do
왜 이걸 받아보는가: 캐글의 타이타닉은 이미 정리된 교육용 데이터입니다. 공공데이터 포털의 실데이터는 컬럼명이 한글이고, 정리되어 있지 않고, 인코딩이 다릅니다.
⚠️ 한국 공공데이터 CSV는 대개 CP949(EUC-KR) 인코딩입니다. 그냥 열면 글자가 깨집니다.
df = pd.read_csv(path, encoding="cp949")
⭐ 데이터를 다루는 일의 절반은 "읽어들이는 것" 입니다. 분석은 그 다음입니다.
8. 이 주의 읽을거리와 그 맥락
수업에서 함께 다룬 자료들입니다. 각각 왜 이 주에 나왔는지가 중요합니다.
8.1 FastAPI 교본
- 점프 투 FastAPI 🔗 https://wikidocs.net/book/8531
이번 주에 우리는 FastAPI의 가장 바깥쪽 껍질만 만졌습니다(앱 생성, 라우트 하나, uvicorn 실행). 이 책은 그 다음 — 요청 본문, 응답 모델, DB 연동 — 을 순서대로 안내합니다. 4.5절의 "구조 나누기" 이후가 필요할 때 펼치면 됩니다.
8.2 에이전틱 AI 시대의 원년
- 김대식 교수 인터뷰 — "생성형 AI 시대는 저물고 2026년은 에이전틱 AI 시대의 원년" 🔗 https://youtu.be/yZEtpzcCcYc
왜 이 주인가: 이번 주에 우리는 Cursor에게 "라이브러리 시스템을 프레임워크 시스템으로 전환하는 방법을 알려줘"라고 물었습니다. 답을 받아 적은 게 아니라 구조 전환의 계획을 맡긴 것입니다. 6.1절의 축 4(수동형 ↔ 추론형)가 실습 안에 이미 들어와 있었다는 이야기입니다.
8.3 컴퓨터의 기본 설계 — 폰 노이만
- 폰 노이만, 컴퓨터 구조를 설계한 인물 🔗 https://youtube.com/shorts/Qz7TVNAPbZI
- 메모리(RAM)와 스토리지(Disk)의 차이 🔗 https://www.corsair.com/kr/ko/explorer/diy-builder/memory/whats-the-difference-between-memory-ram-and-storage/
왜 이 주인가: 축 2(디스크/메모리)의 물리적 근거입니다. 클래스가 디스크에 있고 인스턴스가 메모리에 있다는 말은 비유가 아니라 실제 하드웨어의 이야기입니다. 두 번째 링크는 부품 회사(Corsair)의 설명이라 특히 실물 감각이 좋습니다.
8.4 바이브코딩의 문제점 · 하네스
- 바이브코딩의 문제점 🔗 https://yozm.wishket.com/magazine/detail/3746/
- 하네스 요즘 🔗 https://yozm.wishket.com/magazine/detail/3718/
왜 이 주인가: 이번 주에 v0.app으로 화면을, Cursor로 코드를 말로 만들었습니다. 잘 됐습니다. 그런데 잘 되는 것과 관리되는 것은 다릅니다.
- 만들어진 코드를 내가 읽을 수 있는가
- 다음에 같은 결과를 다시 낼 수 있는가
- 잘못됐을 때 어디를 고쳐야 하는지 아는가
이 세 질문에 답하는 체계가 하네스(Harness) 이고, 3주차의 중심 주제입니다. 7.10절에서 프롬프트를 사양서 형식으로 길게 쓴 것이 그 첫걸음이었습니다.
8.5 문서를 데이터로 바꾸는 인프라
- 한컴 '오픈데이터로더'가 깃허브 트렌딩 1위 — 규칙 기반 + AI 하이브리드 엔진으로 IBM Docling 대비 약 1,000배 빠른 PDF 추출, 35년치 문서 온톨로지를 RAG용 데이터 정제 인프라로 전환한 전략
왜 이 주인가: 축 3(데이터 ↔ 밸류)의 산업 버전입니다. PDF는 사람이 읽는 문서이지, 기계가 밸류를 꺼낼 수 있는 형태가 아닙니다. "문서 더미(데이터)에서 쓸 수 있는 값(밸류)을 꺼내는 일"이 지금 가장 값비싼 인프라라는 뜻입니다. 그리고 그 값을 어디에 쓰느냐 — RAG — 는 3.8절의 세 방법 중 가운데 것입니다.
8.6 서버를 띄우면 생기는 일 — AIOps
- AIOps — SKT가 삼성전자 AIOps 플랫폼 수주 추진. 글로벌 시장 규모 2023년 117억 달러 → 2028년 324억 달러 전망
왜 이 주인가: uvicorn 으로 문을 여는 순간, 세상에 없던 일이 하나 생깁니다 — 운영(Operations) 입니다.
스크립트는 실행하고 끝나지만, 서버는 계속 살아 있어야 합니다.
누가 지켜보고, 죽으면 누가 살리고, 느려지면 누가 아는가.
그 일을 AI가 맡는 시장이 5년 만에 3배로 큰다는 이야기입니다.
8.7 알고리즘이 사람을 지시할 때
- 플랫폼 노동(중개성 · 비정규성 · 알고리즘 통제) 🔗 https://www.worklaw.co.kr/main2022/view/view.asp
왜 이 주인가: 6.2절에서 프로그램이 오브젝트(수동) 에서 서브젝트(능동) 로 넘어오는 이야기를 했습니다. 그 반대편에서 벌어지는 일이 이것입니다 — 사람이 알고리즘의 지시를 받는 구조. 에이전트를 만드는 쪽에 서기 전에, 그것이 무엇을 바꾸는지 한 번은 봐야 합니다.
8.8 모델 경쟁의 다음 라운드
- 구글 I/O 2026 앞두고 유출된 차세대 비디오 생성 모델 'Omni' 전망
왜 이 주인가: 8.2와 짝입니다. 생성 능력은 계속 좋아집니다. 그런데 좋아지는 것이 생성(축 4의 왼쪽) 이고, 판이 옮겨가는 곳은 에이전시(축 4의 오른쪽) 라는 대비를 보세요.
8.9 노코드 도구와 MVP
- 플러터플로우 🔗 https://www.flutterflow.io/
- 개발 단계에서 MVP란 무엇인가 🔗 https://yozm.wishket.com/magazine/detail/1770/
왜 이 주인가: 6.3절의 노코딩 ↔ 노코드 구분과 6.4절의 MVP를 각각 뒷받침합니다.
플러터플로우는 GUI 조립형이고, 우리가 한 방식은 .md 와 자연어 지시형입니다.
같은 "코드를 덜 쓰는 것"인데 결과물의 소유와 확장 가능성이 다릅니다.
8.10 사양이 아니라 가치를 파는 것 — Think Different
- Think Different(1997) 캠페인 🔗 https://youtu.be/0iJp2M3jmfg
왜 이 주인가: MVP를 만들 때 가장 먼저 정해야 하는 것은 기능 목록이 아니라 "무엇을 검증할 것인가" 입니다. 제품 사양 대신 가치관을 판 이 캠페인은, 무엇을 먼저 말할지 정하는 일의 오래된 사례입니다.
8.11 변하는 것과 변하지 않는 것 — 철학 배경지식
- 헤라클레이토스 — "만물은 흐른다"
- 파르메니데스 — 존재의 불변성, 변화는 불가능하다
- 김춘수 〈꽃〉 의 '존재' 판단
- 아고라의 인물 5인 — 소크라테스 · 플라톤 · 제논 · 페리클레스 · 데모스테네스
왜 이 주인가: 이 두 철학자의 대립이 축 2 그 자체입니다.
| 철학 | 이 장의 개념 |
|---|---|
| 파르메니데스 — 존재는 변하지 않는다 | 디스크 · 클래스 · DATA__ (설계도는 안 변함) |
| 헤라클레이토스 — 만물은 흐른다 | 메모리 · 인스턴스 · value (실행 중에 계속 바뀜) |
프로그램은 이 둘을 동시에 갖고 있습니다. 변하지 않는 설계도와 매 순간 변하는 실체입니다. 둘 중 하나만 있으면 프로그램이 성립하지 않습니다.
그리고 김춘수 〈꽃〉 — 이름을 불러주었을 때 비로소 존재가 되는 일.
변수에 이름을 붙이는 것(df = ...), 클래스에 이름을 짓는 것(class James:)이 정확히 그 일입니다.
1주차에 클래스 이름을 PurserMcElroy, BoardingPassReader 처럼 역할이 드러나게 지었던 이유이기도 합니다.
8.12 타이타닉 — 데이터의 각 행은 사람이었다
- 타이타닉 영화 잡학 — 칼 헉슬리가 아이를 이용해 승선한 장면, 로즈가 칼을 외면하는 장면의 의미
- 타이타닉 영화 잡학 — "I'll never let go" 장면
왜 이 주인가: 7.9절에서 우리가 포스트맨으로 받아본 JSON 한 덩어리
{"PassengerId": 2, "Survived": 1, ...} 은 실제로 살아 돌아온 사람 한 명의 기록입니다.
Survived: 1 이라는 밸류 뒤에 어떤 사연이 있었는지를 아는 것과 모르는 것은 다릅니다.
데이터를 다루는 사람의 최소한의 감각입니다.
8.13 1주차 정리
- WEEK 1 정리 🔗 https://gamma.app/docs/WEEK-1-v7sv7fz8by0pzse
이번 주는 1주차에서 만든 것(conda 환경, 타이타닉 CSV, 클래스 모듈, 깃허브 저장소) 위에 껍질을 하나 씌운 주입니다.
1주차가 흐릿하면 이번 주의 .venv 와 requirements.txt 도 흐릿해집니다.
부록 A. 용어 사전
| 용어 | 영문 | 상위 범주 | 정의 |
|---|---|---|---|
| 데이터 | Data | 정보 | 목적을 위해 수집된 사실·수치의 집합체. 거시적 |
| 밸류 | Value | 정보 | 데이터를 구성하는 최소 단위의 구체적 값 |
| 리터럴 | Literal | 표기 | 값 자체를 글자 그대로 적어둔 것 |
| 변수 | Variable | 이름표 | 값을 담아두고 이름으로 부르는 것 |
| 상수 | Constant | 변수 | 프로그램 내내 바뀌지 않는 값. _CSV_PATH |
| 인자 | Argument | 값 | 함수에 전달하는 값 |
| 함수 | Function | 실행 코드 | 동작을 묶어 이름 붙인 것 |
| 메서드 | Method | 함수 | 특정 클래스에 소속된 함수 |
| 클래스 | Class | 설계도 | 객체를 만들기 위한 정의. 디스크에 있음 |
| 인스턴스 | Instance | 실체 | 클래스로부터 메모리에 만들어진 것 |
| 객체 | Object | 실체 | 속성과 기능을 함께 가진 독립된 실체 |
| 주체 | Subject | — | 행위를 하는 쪽. Object의 반대말 |
| 메모리 | Memory / RAM | 저장 장치 | 휘발성 임시 공간. 실존하지 않는 공간(추상) |
| 스토리지 | Storage / Disk | 저장 장치 | 영구 저장 공간. 실존하는 공간(구상) |
| 저장 | Save | 방향 | 메모리 → 디스크 |
| 불러오기 | Load | 방향 | 디스크 → 메모리 |
| 업로드 | Upload | 방향 | 내 컴퓨터 → 서버 (네트워크 경계) |
| 다운로드 | Download | 방향 | 서버 → 내 컴퓨터 (네트워크 경계) |
| 폰 노이만 구조 | von Neumann Architecture | 컴퓨터 구조 | CPU + 메모리 + 프로그램. 버스로 연결 |
| 버스 | Bus | 부품 | CPU와 메모리를 잇는 통로 |
| 폰 노이만 병목 | von Neumann Bottleneck | 한계 | 명령어와 데이터가 같은 버스를 공유해 동시 접근 불가 |
| 논리 | Logic | 규칙 | 올바른 추론의 원리·규칙 (문법) |
| 논증 | Argument | 결과물 | 그 규칙으로 펼친 실제 주장 (문장) |
| 스크립트 | Script | 실행 형태 | 위에서 아래로 한 번 실행되고 끝나는 코드 |
| 라이브러리 | Library | 코드 묶음 | 내가 골라 부르는 도구상자 |
| 프레임워크 | Framework | 코드 묶음 | 나를 부르는 작업장. 구조 중심 |
| 제어의 역전 | IoC (Inversion of Control) | 원리 | 제어권이 내 코드에서 프레임워크로 넘어감 |
| 엔트리 포인트 | Entry Point | 위치 | 제어권이 OS에서 프로그램으로 넘어오는 첫 지점 |
| ASGI | Asynchronous Server Gateway Interface | 규격 | 파이썬 웹 앱과 서버가 대화하는 표준 |
| FastAPI | — | 프레임워크 | 파이썬 ASGI 웹 프레임워크 |
| uvicorn | — | 서버 | ASGI 앱을 실제로 띄우는 웹 서버 |
| 라우트 | Route | 매핑 | 주소와 처리 함수를 연결한 것 |
| 데코레이터 | Decorator | 문법 | @ 로 함수에 역할을 등록하는 표기 |
| Pydantic | — | 라이브러리 | 데이터의 모양을 클래스로 선언·검증 |
| Swagger UI | — | 문서 | /docs 에 자동 생성되는 API 시험 화면 |
| 가상환경 | Virtual Environment | 격리 | 프로젝트 전용 패키지 공간. .venv |
| requirements.txt | — | 목록 | 설치할 외부 패키지 목록 (환경의 문제) |
| DI | Dependency Injection | 설계 기법 | 쓸 객체를 밖에서 넣어주는 것 (설계의 문제) |
| 모노레포 | Monorepo | 저장소 구조 | 하나의 저장소에 모든 프로젝트 |
| cwd | Current Working Directory | 경로 | 명령을 실행한 현재 폴더 |
__file__ | — | 파이썬 변수 | 그 코드 파일 자신의 경로 |
__name__ | — | 파이썬 변수 | 직접 실행되면 "__main__", import되면 모듈명 |
| 프로필 | Profile | 설정 파일 | 터미널을 열 때마다 자동 실행되는 시작 스크립트 |
| 닷 소싱 | Dot Sourcing | 실행 방식 | 스크립트를 현재 세션 안에서 실행 (. ".\...ps1") |
| 실행 정책 | Execution Policy | 보안 설정 | PowerShell이 스크립트 실행을 허용하는 범위 |
| API | Application Programming Interface | 창구 | 프로그램끼리 약속된 방식으로 주고받는 통로 |
| REST | Representational State Transfer | 설계 원칙 | 자원은 주소로, 행위는 메서드로 |
| CRUD | Create-Read-Update-Delete | 동작 분류 | 데이터를 다루는 네 가지 기본 동작 |
| HTTP 상태코드 | Status Code | 응답 | 2xx 성공 / 3xx 이동 / 4xx 요청 문제 / 5xx 서버 문제 |
| JSON | JavaScript Object Notation | 데이터 형식 | key-value 쌍으로 된 텍스트 데이터 형식 |
| 루프백 | Loopback (127.0.0.1) | 주소 | "이 컴퓨터 자신"을 가리키는 주소 |
| localhost | — | 별명 | 127.0.0.1 의 다른 이름 |
| 포트 | Port | 주소 조각 | 한 컴퓨터 안의 여러 문 중 하나 (:8000) |
| 포스트맨 | Postman | 도구 | API 요청을 만들어 보내고 응답을 확인하는 도구 |
| 데이터프레임 | DataFrame | 자료구조 | 행과 열로 된 2차원 표 (pandas) |
| 이진 분류 | Binary Classification | ML 문제 | 두 그룹으로 나누는 가장 기초적인 분류 문제 |
| 모델 | Model | AI 산출물 | 데이터 학습으로 알아낸 패턴·규칙·수식 |
| 사전 학습 모델 | Pre-trained Model | 모델 | 방대한 데이터로 이미 학습을 마친 모델 |
| 파인튜닝 | Fine-tuning | 학습 방법 | 사전 학습 모델에 목적 데이터를 추가 학습 |
| RAG | Retrieval-Augmented Generation | 기법 | 모델은 그대로 두고 참고 자료를 붙이는 방식 |
| 생성형 AI | Generative AI | AI 분류 | 요청받은 것을 만들어 내는 AI |
| 에이전틱 AI | Agentic AI | AI 분류 | 목표를 받고 스스로 계획·실행하는 AI |
| 에이전트 | Agent | 소프트웨어 | 추론형 — 다음 행동을 스스로 정함 |
| 어플 | Application | 소프트웨어 | 수동형 — 정해진 입력에 정해진 출력 |
| 노코딩 | — | 작업 방식 | 코드 문법 대신 .md 와 자연어로 지시하는 것 |
| 노코드 | No-code | 도구 유형 | GUI에서 부품을 드래그로 조립하는 방식 |
| MVP | Minimum Viable Product | 제품 전략 | 핵심 가치를 검증할 최소한만 먼저 만드는 것 |
| PascalCase | — | 표기법 | TitanicQaApp — 클래스 이름에 사용 |
| snake_case | — | 표기법 | read_titanic_data — 파이썬 함수·변수 |
| 파스칼린 | Pascaline | 기계 | 1642년 최초의 상업화 기계식 계산기 |
| 캐리 | Carry | 연산 | 자릿수가 넘칠 때 옆 자리로 넘기는 '올림' |
| AIOps | AI for IT Operations | 분야 | 시스템 운영을 AI로 자동화·예측하는 영역 |
부록 B. 스스로 확인하기
먼저 답해보고, 막히면 옆의 절을 펼치세요.
| # | 질문 | 답이 있는 곳 |
|---|---|---|
| 1 | 스크립트와 서버의 차이를 "진입점"이라는 단어로 설명할 수 있는가? | 4.3 |
| 2 | 라이브러리와 프레임워크를 가르는 세 가지 축은? | 4.2 |
| 3 | 클래스와 인스턴스는 각각 디스크와 메모리 중 어디에 있는가? | 3.2 |
| 4 | 메모리를 왜 "실존하지 않는 공간"이라고 하는가? | 1.3 |
| 5 | 디스크에서 메모리로 데이터를 가져오는 것을 무엇이라 부르는가? | 1.4 |
| 6 | df 전체와 df.at[1,'Age'] 는 각각 데이터인가 밸류인가? | 2.2 |
| 7 | "리터럴이 구조를 만든다"는 무슨 뜻인가? | 2.5 |
| 8 | x = x + 1 이 수학적으로는 틀렸는데 코드에서는 성립하는 이유는? | 2.7 |
| 9 | "클래스 + 인스턴스 = 오브젝트" 는 무엇을 말하는가? | 3.4 |
| 10 | 오브젝트와 서브젝트의 차이는? | 3.6 |
| 11 | requirements.txt 와 DI 는 같은 '의존성'인가? | 4.6 |
| 12 | uvicorn main:app 에서 콜론 좌우는 각각 무엇인가? | 7.5 |
| 13 | 상대 경로 대신 Path(__file__) 를 쓰는 이유는? | 4.5 |
| 14 | 401과 403은 각각 어디부터 확인해야 하는가? | 5.4 |
| 15 | 어플과 에이전트를 가르는 축은? | 6.2 |
| 16 | 파인튜닝 전에 먼저 시도해야 할 두 가지는? | 3.8 |
| 17 | 프론트만 배포하면 왜 데이터가 안 오는가? | 7.10 |
부록 C. 자주 하는 실수
| 실수 | 바로잡기 |
|---|---|
| "디스크 → 메모리 = 업로드" | ❌ 불러오기(Load) 입니다. 업로드는 네트워크를 넘을 때만 |
| "메모리 부족 = 저장 공간 부족" | ❌ 완전히 다릅니다. 하나는 책상, 하나는 창고 |
| "클래스도 실행 중에만 존재한다" | ⚠️ 클래스는 .py 파일로 디스크에 항상 있습니다 |
| "객체와 인스턴스는 다른 것이다" | ⚠️ 같은 대상, 다른 관점입니다 (소속 강조 ↔ 물건 자체 강조) |
| "Object의 반대는 Instance" | ❌ Subject(주체) 입니다 |
| "데이터와 밸류는 같은 말" | ❌ 데이터는 집합, 밸류는 최소 단위 |
"= 는 같다는 뜻" | ❌ = 는 넣는다, == 가 같다 |
"true 와 "true" 는 같다" | ❌ 하나는 참·거짓 값, 하나는 글자 네 개 |
| "프레임워크는 큰 라이브러리다" | ❌ 진입점을 누가 잡는가가 다릅니다 |
"requirements.txt 가 곧 DI" | ❌ 하나는 환경, 하나는 설계입니다 |
"if __name__ == "__main__" 은 그냥 관례" | ⚠️ "직접 실행됐을 때만"이라는 조건입니다 |
| "상대 경로면 어디서든 잘 돌아간다" | ⚠️ cwd 기준이라 실행 위치가 바뀌면 깨집니다 |
"DataFrame 을 그대로 반환하면 된다" | ❌ HTTP는 텍스트만 나릅니다. list[dict] 로 변환 |
| "설치했는데 import가 안 된다" | ⚠️ conda 환경과 .venv 혼용을 의심하세요 |
"taskkill /F /IM python.exe 는 안전하다" | ⚠️ 모든 파이썬 프로세스를 끕니다 |
| "실행 정책을 영구히 Bypass로 바꾸자" | ⚠️ -Scope Process 로 그 창에서만 푸세요 |
"127.0.0.1 이면 남들도 접속된다" | ❌ 내 컴퓨터에서만 열립니다 |
| "프론트를 배포했으니 끝" | ⚠️ 백엔드가 로컬이면 다른 사람 화면엔 데이터가 안 옵니다 |
| "노코딩은 코드가 없다는 뜻" | ❌ 사람이 문법을 타이핑하지 않는다는 뜻입니다 |
| "생성형 AI = 에이전틱 AI" | ❌ 누가 다음 행동을 정하는가가 다릅니다 |
| "성능이 아쉬우면 바로 파인튜닝" | ⚠️ 프롬프팅 → RAG → 파인튜닝 순서로 |
| "공공데이터 CSV가 안 열린다" | ⚠️ encoding="cp949" 를 지정해보세요 |
부록 D. 날짜별 색인
이 장의 내용이 실제 수업에서 어느 날 다뤄졌는지입니다.
| 날짜 | 다룬 내용 | 이 장의 절 |
|---|---|---|
| 5/4 (월) | Cursor 상태 바 설정, import 노란 줄과 퀵픽스, 깃허브 3줄 명령, 공공데이터 포털 교통사고 데이터, 파스칼린과 Pascal→Object Pascal→델파이 계보(PascalCase), 한컴 오픈데이터로더, 플랫폼 노동, 구글 I/O Omni, 타이타닉 영화 잡학 | 7.1, 7.2, 7.11, 1.1, 8.5, 8.7, 8.8, 8.12 |
| 5/5 (화) | 생성형 AI에서 에이전틱 AI로, 폰 노이만이라는 인물 | 6.1, 8.2, 8.3 |
| 5/6 (수) | 폰 노이만 구조(CPU·메모리·버스·병목), 메모리 vs 스토리지, 논리 vs 논증, 플러터플로우, MVP, Think Different, 헤라클레이토스·파르메니데스·김춘수 | 1.2, 1.3, 1.5, 6.4, 8.9, 8.10, 8.11 |
| 5/7 (목) | FastAPI로 앱 구조 전환, 라이브러리 vs 프레임워크, 엔트리 포인트, 식당 비유 7단계, 전환 6단계, .venv·requirements.txt, PowerShell 프로필 자동화, 서버 새로고침(taskkill·--app-dir), DI 실행, 데이터 vs 밸류, 클래스·인스턴스·객체, 점프 투 FastAPI, AIOps | 2.1 |
| 5/8 (금) | 백엔드↔프론트엔드와 API, 어플 vs 에이전트, 노코딩과 두 에디터, 저장/불러오기 vs 업로드/다운로드, DATA__ vs value, 리터럴과 구조, 읽는 방향(사람/기계), 파인튜닝, 객체 vs 모델, 엔트리 포인트, 오브젝트 vs 서브젝트, v0.app UI 구현·배포, 포스트맨 설치와 첫 요청, 바이브코딩의 문제점, WEEK 1 정리 | 1.3, 1.4, 2.3 |
부록 E. Gemini / NotebookLM 프롬프트
복습 문제 받기
이 2주차 교재만 근거로 8문제를 내줘. 비전공자 기준으로.
"라이브러리 vs 프레임워크"와 "저장/불러오기 vs 업로드/다운로드"는 반드시 포함해줘.
답은 바로 주지 말고, 내가 답한 다음에 채점하고
틀린 이유를 교재의 어느 절을 근거로 설명해줘. 교재에 없는 내용은 꺼내지 마.
인포그래픽 ① — 이 장의 중심
「4.4 식당으로 보는 전체 그림」을 인포그래픽 1장으로 만들어줘.
- 위쪽은 "전환 전": 혼자 냉장고를 열어 먹는 그림 + `python james.py`
- 아래쪽은 "전환 후": 식당 그림 + 손님→주문→주방→음식
- 각 식당 요소(문·주문창구·주방장·주방도구·도구목록)에 대응하는 코드 요소를
(uvicorn / FastAPI / class / .venv / requirements.txt) 라벨로 붙여줘
- 맨 아래에 "실행의 주체가 스크립트에서 uvicorn으로 옮겨갔다" 한 문장을 크게
- 전문용어는 한글(영문) 병기
인포그래픽 ② — 두 개의 공간
「1.3 메모리와 스토리지」와 「3.2 클래스는 디스크, 인스턴스는 메모리」를 한 장으로 합쳐줘.
- 화면을 좌우로 나눠 왼쪽 "디스크(구상·영구)", 오른쪽 "메모리(추상·휘발)"
- 왼쪽에 클래스 / DATA__ / .py 파일, 오른쪽에 인스턴스 / value / 실행 중인 앱
- 가운데 화살표 두 개에 각각 "불러오기(Load)"와 "저장(Save)"
- 화면 바깥으로 나가는 화살표에 "업로드/다운로드 — 여기부터는 네트워크" 라고 따로 표시
인포그래픽 ③ — 요청 한 번의 여정
「4.4 전체 흐름 한눈에 보기」와 「5.2 API의 3요소」를 세로 흐름도로 만들어줘.
브라우저 → uvicorn → main.py(라우트) → james.py(서비스) → CSV → JSON 응답
각 단계 옆에 "여기서 무슨 일이 일어나는가"를 한 줄씩,
오른쪽 세로 띠에 "주소 / 방식 / 응답" 3요소가 어디에 해당하는지 표시해줘.
막힐 때
2주차에서 "___" 가 이해가 안 돼.
이 교재의 판별 축 5개(혼자/여럿, 디스크/메모리, 집합/최소단위, 수동형/추론형, 내 컴퓨터/인터넷 너머)만
써서 다시 설명해줘. 교재에 없는 새 비유는 만들지 마.
미국식 분류로 다시 정리하기
이 교재에 나온 비유(식당, 장바구니, 쿠키 틀, 책상과 창고)를 전부 걷어내고,
"이것은 무엇의 한 종류인가 / 형제 개념과 무엇으로 갈리는가" 형식으로만
데이터·밸류·리터럴·클래스·인스턴스·객체·주체를 다시 정의해줘.
실습 재현 점검
이 교재의 7장(실습)만 보고, 내가 지금 빈 폴더에서 시작해서
포스트맨으로 200 OK를 받기까지 필요한 명령어를 순서대로 나열해줘.
각 명령어마다 "이게 실패하면 무슨 에러가 나고 어디를 봐야 하는지"를 한 줄씩 붙여줘.
다음 장 연결 확인
이 교재에서 "앞으로 다시 만납니다"라고 표시된 부분을 전부 찾아서,
이번 장의 어떤 개념이 3주차에 어떤 이름으로 다시 나오는지 표로 정리해줘.
그리고 0장의 판별 축 5개가 3주차에서 어떻게 확장되는지도 함께 표에 넣어줘.
LangTailor