본문으로 건너뛰기
AI는 어디에서 동작하는가 — 서버 실습으로 확인하기

생성 수정

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 pippip 자체를 최신으로
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%가 사라집니다.

  1. 터미널을 열면 항상 루트로 이동 후 .venv 활성화
  2. 패키지 추가는 루트에서만
  3. 변경 후에는 항상 pip freeze > requirements.txt
  4. 다른 PC·CI도 pip install -r requirements.txt 한 줄로 동일 환경

⚠️ conda 환경과 python -m venv 는 다릅니다.

conda 환경python -m venv
어디에 만들어지나아나콘다가 관리하는 중앙 폴더프로젝트 폴더 안 .venv
관리 도구condapip
활성화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로 저장하는 프롬프트 — 요구 사항은 셋입니다.

  1. app = FastAPI(title="Titanic (James)")
  2. 루트 / 는 {"message": "FAST API 초기화 성공", "docs": "/docs"} 를 반환
  3. 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 다운로드 후 설치

첫 요청 만들기

  1. 좌측 COLLECTIONS 옆 + → 드롭다운에서 HTTP 선택
  2. Untitled Request 이름을 titanic 으로 변경
  3. 메서드 GET, URL http://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-auto
  • dark: 다크모드 대응

배포하기

  1. 생성 후 우측 상단 Publish
  2. Production Deployment 가 Initializing → Building → Updated 로 진행

도메인 연결

  1. Settings → Domains
  2. Default Domain 지정 후 Save
  3. Connected Domains 의 Add → 도메인 입력
  4. Connect to an environment = Production 선택 → Save
  5. 다음 화면에서 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 공공데이터 다뤄보기

왜 이걸 받아보는가: 캐글의 타이타닉은 이미 정리된 교육용 데이터입니다. 공공데이터 포털의 실데이터는 컬럼명이 한글이고, 정리되어 있지 않고, 인코딩이 다릅니다.

⚠️ 한국 공공데이터 CSV는 대개 CP949(EUC-KR) 인코딩입니다. 그냥 열면 글자가 깨집니다.

df = pd.read_csv(path, encoding="cp949")

⭐ 데이터를 다루는 일의 절반은 "읽어들이는 것" 입니다. 분석은 그 다음입니다.


8. 이 주의 읽을거리와 그 맥락

수업에서 함께 다룬 자료들입니다. 각각 왜 이 주에 나왔는지가 중요합니다.

8.1 FastAPI 교본

이번 주에 우리는 FastAPI의 가장 바깥쪽 껍질만 만졌습니다(앱 생성, 라우트 하나, uvicorn 실행). 이 책은 그 다음 — 요청 본문, 응답 모델, DB 연동 — 을 순서대로 안내합니다. 4.5절의 "구조 나누기" 이후가 필요할 때 펼치면 됩니다.

8.2 에이전틱 AI 시대의 원년

  • 김대식 교수 인터뷰 — "생성형 AI 시대는 저물고 2026년은 에이전틱 AI 시대의 원년" 🔗 https://youtu.be/yZEtpzcCcYc

왜 이 주인가: 이번 주에 우리는 Cursor에게 "라이브러리 시스템을 프레임워크 시스템으로 전환하는 방법을 알려줘"라고 물었습니다. 답을 받아 적은 게 아니라 구조 전환의 계획을 맡긴 것입니다. 6.1절의 축 4(수동형 ↔ 추론형)가 실습 안에 이미 들어와 있었다는 이야기입니다.

8.3 컴퓨터의 기본 설계 — 폰 노이만

왜 이 주인가: 축 2(디스크/메모리)의 물리적 근거입니다. 클래스가 디스크에 있고 인스턴스가 메모리에 있다는 말은 비유가 아니라 실제 하드웨어의 이야기입니다. 두 번째 링크는 부품 회사(Corsair)의 설명이라 특히 실물 감각이 좋습니다.

8.4 바이브코딩의 문제점 · 하네스

왜 이 주인가: 이번 주에 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 알고리즘이 사람을 지시할 때

왜 이 주인가: 6.2절에서 프로그램이 오브젝트(수동) 에서 서브젝트(능동) 로 넘어오는 이야기를 했습니다. 그 반대편에서 벌어지는 일이 이것입니다 — 사람이 알고리즘의 지시를 받는 구조. 에이전트를 만드는 쪽에 서기 전에, 그것이 무엇을 바꾸는지 한 번은 봐야 합니다.

8.8 모델 경쟁의 다음 라운드

  • 구글 I/O 2026 앞두고 유출된 차세대 비디오 생성 모델 'Omni' 전망

왜 이 주인가: 8.2와 짝입니다. 생성 능력은 계속 좋아집니다. 그런데 좋아지는 것이 생성(축 4의 왼쪽) 이고, 판이 옮겨가는 곳은 에이전시(축 4의 오른쪽) 라는 대비를 보세요.

8.9 노코드 도구와 MVP

왜 이 주인가: 6.3절의 노코딩 ↔ 노코드 구분과 6.4절의 MVP를 각각 뒷받침합니다. 플러터플로우는 GUI 조립형이고, 우리가 한 방식은 .md 와 자연어 지시형입니다. 같은 "코드를 덜 쓰는 것"인데 결과물의 소유와 확장 가능성이 다릅니다.

8.10 사양이 아니라 가치를 파는 것 — Think Different

왜 이 주인가: 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주차 정리

이번 주는 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에서 프로그램으로 넘어오는 첫 지점
ASGIAsynchronous Server Gateway Interface규격파이썬 웹 앱과 서버가 대화하는 표준
FastAPI—프레임워크파이썬 ASGI 웹 프레임워크
uvicorn—서버ASGI 앱을 실제로 띄우는 웹 서버
라우트Route매핑주소와 처리 함수를 연결한 것
데코레이터Decorator문법@ 로 함수에 역할을 등록하는 표기
Pydantic—라이브러리데이터의 모양을 클래스로 선언·검증
Swagger UI—문서/docs 에 자동 생성되는 API 시험 화면
가상환경Virtual Environment격리프로젝트 전용 패키지 공간. .venv
requirements.txt—목록설치할 외부 패키지 목록 (환경의 문제)
DIDependency Injection설계 기법쓸 객체를 밖에서 넣어주는 것 (설계의 문제)
모노레포Monorepo저장소 구조하나의 저장소에 모든 프로젝트
cwdCurrent Working Directory경로명령을 실행한 현재 폴더
__file__—파이썬 변수그 코드 파일 자신의 경로
__name__—파이썬 변수직접 실행되면 "__main__", import되면 모듈명
프로필Profile설정 파일터미널을 열 때마다 자동 실행되는 시작 스크립트
닷 소싱Dot Sourcing실행 방식스크립트를 현재 세션 안에서 실행 (. ".\...ps1")
실행 정책Execution Policy보안 설정PowerShell이 스크립트 실행을 허용하는 범위
APIApplication Programming Interface창구프로그램끼리 약속된 방식으로 주고받는 통로
RESTRepresentational State Transfer설계 원칙자원은 주소로, 행위는 메서드로
CRUDCreate-Read-Update-Delete동작 분류데이터를 다루는 네 가지 기본 동작
HTTP 상태코드Status Code응답2xx 성공 / 3xx 이동 / 4xx 요청 문제 / 5xx 서버 문제
JSONJavaScript Object Notation데이터 형식key-value 쌍으로 된 텍스트 데이터 형식
루프백Loopback (127.0.0.1)주소"이 컴퓨터 자신"을 가리키는 주소
localhost—별명127.0.0.1 의 다른 이름
포트Port주소 조각한 컴퓨터 안의 여러 문 중 하나 (:8000)
포스트맨Postman도구API 요청을 만들어 보내고 응답을 확인하는 도구
데이터프레임DataFrame자료구조행과 열로 된 2차원 표 (pandas)
이진 분류Binary ClassificationML 문제두 그룹으로 나누는 가장 기초적인 분류 문제
모델ModelAI 산출물데이터 학습으로 알아낸 패턴·규칙·수식
사전 학습 모델Pre-trained Model모델방대한 데이터로 이미 학습을 마친 모델
파인튜닝Fine-tuning학습 방법사전 학습 모델에 목적 데이터를 추가 학습
RAGRetrieval-Augmented Generation기법모델은 그대로 두고 참고 자료를 붙이는 방식
생성형 AIGenerative AIAI 분류요청받은 것을 만들어 내는 AI
에이전틱 AIAgentic AIAI 분류목표를 받고 스스로 계획·실행하는 AI
에이전트Agent소프트웨어추론형 — 다음 행동을 스스로 정함
어플Application소프트웨어수동형 — 정해진 입력에 정해진 출력
노코딩—작업 방식코드 문법 대신 .md 와 자연어로 지시하는 것
노코드No-code도구 유형GUI에서 부품을 드래그로 조립하는 방식
MVPMinimum Viable Product제품 전략핵심 가치를 검증할 최소한만 먼저 만드는 것
PascalCase—표기법TitanicQaApp — 클래스 이름에 사용
snake_case—표기법read_titanic_data — 파이썬 함수·변수
파스칼린Pascaline기계1642년 최초의 상업화 기계식 계산기
캐리Carry연산자릿수가 넘칠 때 옆 자리로 넘기는 '올림'
AIOpsAI for IT Operations분야시스템 운영을 AI로 자동화·예측하는 영역

부록 B. 스스로 확인하기

먼저 답해보고, 막히면 옆의 절을 펼치세요.

#질문답이 있는 곳
1스크립트와 서버의 차이를 "진입점"이라는 단어로 설명할 수 있는가?4.3
2라이브러리와 프레임워크를 가르는 세 가지 축은?4.2
3클래스와 인스턴스는 각각 디스크와 메모리 중 어디에 있는가?3.2
4메모리를 왜 "실존하지 않는 공간"이라고 하는가?1.3
5디스크에서 메모리로 데이터를 가져오는 것을 무엇이라 부르는가?1.4
6df 전체와 df.at[1,'Age'] 는 각각 데이터인가 밸류인가?2.2
7"리터럴이 구조를 만든다"는 무슨 뜻인가?2.5
8x = x + 1 이 수학적으로는 틀렸는데 코드에서는 성립하는 이유는?2.7
9"클래스 + 인스턴스 = 오브젝트" 는 무엇을 말하는가?3.4
10오브젝트와 서브젝트의 차이는?3.6
11requirements.txt 와 DI 는 같은 '의존성'인가?4.6
12uvicorn main:app 에서 콜론 좌우는 각각 무엇인가?7.5
13상대 경로 대신 Path(__file__) 를 쓰는 이유는?4.5
14401과 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, AIOps2.12.3, 3.13.5, 4 전체, 7.3~7.8, 8.1, 8.6
5/8 (금)백엔드↔프론트엔드와 API, 어플 vs 에이전트, 노코딩과 두 에디터, 저장/불러오기 vs 업로드/다운로드, DATA__ vs value, 리터럴과 구조, 읽는 방향(사람/기계), 파인튜닝, 객체 vs 모델, 엔트리 포인트, 오브젝트 vs 서브젝트, v0.app UI 구현·배포, 포스트맨 설치와 첫 요청, 바이브코딩의 문제점, WEEK 1 정리1.3, 1.4, 2.32.7, 3.63.8, 4.3, 5, 6.2, 6.3, 7.9, 7.10, 8.4, 8.13

부록 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주차에서 어떻게 확장되는지도 함께 표에 넣어줘.