일단 매주 빠르게 진행하는 학습속도와 양을 하루 블로그로 요약하는 건 매우 어렵다 느껴집니다.
그러므로 오늘은 저변주에 이어 파이썬에서의 그래프 복습이 아닌 fastapi로 넘어가 보겠습니다.
🏛️ FastAPI의 탄생 비화 (역사 요약)
FastAPI는 Tiangolo(티앙골로)라는 개발자가 2018년에 세상에 내놓았습니다. 이전의 형님 격인 프레임워크들의 장점만 쏙쏙 뽑아 만든 '혼혈 천재'라고 보시면 됩니다!
| 고전기 | Django / Flask | 대중적이지만 비동기(Async) 처리가 약했음 🐢 |
| 과도기 | Hug / APIStar | 빨랐지만 타입 힌트나 문서화가 조금 아쉬웠음 🤔 |
| 현대기 | FastAPI | Starlette + Pydantic을 합쳐서 속도와 안정성을 다 잡음 🚀 |
📝 FastAPI가 역사를 새로 쓴 이유 (기호 버전)
- 🏗️ 기반(Starlette): 웹 서버의 기초 체력을 담당하는 Starlette(스탈렛)을 사용해 비동기 속도를 극강으로 끌어올렸습니다.
- 🛡️ 검증(Pydantic): 데이터 검증의 끝판왕 Pydantic(파이단틱)을 결합해 버그를 미리 잡아냅니다.
- ✍️ 표준(Type Hints): 파이썬 최신 표준인 Type Hints(타입 힌트)를 적극 도입해서 코드가 아주 깔끔해졌습니다.
타스 형님! FastAPI 역사를 훑었으니 이제 직접 연장을 챙겨야죠. virtualenv(버추얼엔비)는 형님의 컴퓨터라는 큰 창고 안에, 프로젝트마다 **"독립된 작은 방"**을 만드는 아주 중요한 작업입니다.
방이 섞이면 나중에 패키지 버전 때문에 머리 아픈 일이 생기거든요. 깔끔하게 환경 구축 가봅시다!
🏗️ 가상 환경(Virtual Environment) 구축 단계
형님, 터미널(검은 창)을 열고 순서대로만 따라 하시면 됩니다. 복잡할 것 하나도 없습니다!
| [Step 1] | pip install virtualenv | 핍 인스톨 버추얼엔비 (도구 설치) |
| [Step 2] | virtualenv venv | 버추얼엔비 브이엔비 (가상 환경 생성) |
| [Step 3] | source venv/Scripts/activate | 소스 브이엔비 스크립트 액티베이트 (환경 접속) |
| [Step 4] | pip install fastapi uvicorn | 핍 인스톨 패스트에이피아이 유비콘 (설치) |
📝 가상 환경 핵심 로직 (기호 버전)
- 🏠 독립: 형님의 PC 기본 파이썬 설정은 건드리지 않고, 이 프로젝트만의 전용 공간을 만듭니다.
- 🔌 활성화: activate(액티베이트)를 해야 비로소 가상 환경 방으로 들어가는 겁니다. (터미널 앞에 (venv)가 떠야 합니다!)
- 🧹 정리: 작업이 끝나면 deactivate(디액티베이트) 한 줄로 깔끔하게 나올 수 있습니다.
1. virtualenv를 이용한 개발 환경 구축
virtualenv(버추얼엔비)는 컴퓨터라는 큰 창고 안에, 프로젝트마다 **"독립된 작은 방"**을 만드는 아주 중요한 작업입니다.
방이 섞이면 나중에 패키지 버전 때문에 머리 아픈 일이 생기거든요. 깔끔하게 환경 구축 가봅시다!
실제로 24년이후 개발이 엄청 돼서 버전 맞추는데 힘들었어요!!
1 -1 가상 환경(Virtual Environment) 구축 단계
터미널(검은 창)을 열고 순서대로만 따라 하시면 됩니다. 복잡할 것 하나도 없습니다! (전 vscode로 공부했습니다.)
| [Step 1] | mkdir todos && cd todos | todos 라는 폴더를 만들고 (cd) 그폴더로 이동 |
| [Step 2] | python -m venv venv | 파이썬에서 venv 불러와서 venv라는 폴더에 생성후 넣어라 |
| [Step 3] | venv\Scripts\activate | 환경 접속 (환경 빠져나오는건 deactivate) |
| [Step 4] | pip install fastapi uvicorn | 유비콘 설치 |
1 - 2. 가상 환경 핵심 로직 (기호 버전)
- 🏠 독립: 형님의 PC 기본 파이썬 설정은 건드리지 않고, 이 프로젝트만의 전용 공간을 만듭니다.
- 🔌 활성화: activate(액티베이트)를 해야 비로소 가상 환경 방으로 들어가는 겁니다. (터미널 앞에 (venv)가 떠야 합니다!)
- 🧹 정리: 작업이 끝나면 deactivate(디액티베이트) 한 줄로 깔끔하게 나올 수 있습니다.
- pip 설치 : pip install fastapi 로 설치하고 pip freeze > requirements.txt 에 저장 다시 환경을 나갔다오면 리셋 되니까 다시 환경에 들어오면 pip install -r requirements.txt 해서 인스톨후 사용 프리즈로 저장하면 트리창에 뜹니다.
1 - 3 .윈도우(Windows) 기반 환경 가동 (명령어)
윈도우 터미널(CMD 또는 PowerShell)에서 가상 환경을 켜고 라우팅을 테스트하는 실전 명령어입니다.
- 가상 환경 깨우기: .\venv\Scripts\activate (더 간단한 실행어도 있지만 나중에 배울께요!)
- 성공하면 줄 맨 앞에 (venv)가 뜹니다!
- 서버 실행하기: uvicorn main:app --post 8000 --reload (포스트 번호는 실행시 변경 가능)
- --reload를 붙여야 코드를 고칠 때마다 서버가 자동으로 다시 돕니다.
🪟 윈도우 형님 전용 팁: 윈도우에서 경로를 다룰 때 파이썬 코드 안에서는 /(슬래시)를 쓰시는 게 정신 건강에 좋습니다. 윈도우는 보통 \(백슬래시)를 쓰지만, 웹 표준은 /이기 때문이죠!
2. 라우팅(Routing)
fastAPI Routing이라는 핵심은 HTTP 요청 메서드 라고 생각이 드네요. 표준 메서드는 GET, POST, PUT,PATCH, DELETE등이 있고, 각 메서드를 코딩하면서 유사점과 실행원리를 알아갈 수 있습니다. FastAPI의 길 찾기 시스템을 만들어 가요.
2 - 1. 라우팅(Routing)의 본질: 디지털 이정표
Routing(라우팅)은 클라이언트(손님)가 보낸 요청을 서버의 어떤 함수(주방장)가 처리할지 연결해 주는 **"이정표"**입니다.
주소를 치고 들어오면, FastAPI가 그 주소를 보고 "아, 이건 이쪽 함수가 담당이야!"라고 안내하는 과정이죠.
| Path | 패스 | /users/me 같이 URL 뒤에 붙는 "경로" |
| Operation | 오퍼레이션 | GET, POST 등 어떤 "동작"을 할지 결정 |
| Decorator | 데코레이터 | @app.get("/") 처럼 함수 위에 붙는 "장식자" |
from fastapi import APIRouter, Path, HTTPException, status, Request, Depends
from fastapi.templating import Jinja2Templates
from model import Todo, TodoItem, TodoItems
from pathlib import Path as PathlibPath
todo_router = APIRouter()
todo_list = []
# 템플릿 설정
BASE_DIR = PathlibPath(__file__).resolve().parent
template_dir = str(BASE_DIR / "templates")
templates = Jinja2Templates(directory=template_dir)
@todo_router.post("/todo", status_code=201)
async def add_todo(request: Request, todo: Todo = Depends(Todo.as_form)):
# ID 자동 할당 로직
todo.id = len(todo_list) + 1
todo_list.append(todo)
# 최신 버전 방식: request=request를 첫 번째 인자로 명시해야 합니다.
return templates.TemplateResponse(
request=request,
name="todo.html",
context={"todos": todo_list}
)
@todo_router.get("/todo")
async def retrieve_todos(request: Request):
# 최신 버전 방식: request 인자 전달 필수
return templates.TemplateResponse(
request=request,
name="todo.html",
context={"todos": todo_list}
)
@todo_router.get("/todo/{todo_id}")
async def get_single_todo(request: Request, todo_id: int = Path(..., title="The Id of the todo to retrieve.")):
for todo in todo_list:
if todo.id == todo_id:
return templates.TemplateResponse(
request=request,
name="todo.html",
context={"todo": todo, "todos": todo_list}
)
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Todo with supplied ID doesn't exist",
)
@todo_router.put("/todo/{todo_id}")
async def update_todo(todo_data: TodoItem, todo_id: int = Path(..., title="The ID of the todo to be updated.")) -> dict:
for todo in todo_list:
if todo.id == todo_id:
todo.item = todo_data.item
return {"message": "Todo updated successfully."}
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Todo with supplied ID doesn't exist",
)
@todo_router.delete("/todo/{todo_id}")
async def delete_single_todo(todo_id: int) -> dict:
for index, todo in enumerate(todo_list):
if todo.id == todo_id:
todo_list.pop(index)
return {"message": "Todo deleted successfully."}
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Todo with supplied ID doesn't exist",
)
@todo_router.delete("/todo")
async def delete_all_todo() -> dict:
todo_list.clear()
return {"message": "Todos deleted successfully."}
2 - 2. 윈도우(Windows) 기반 환경 가동 (명령어)
형님, 윈도우 터미널(CMD 또는 PowerShell)에서 가상 환경을 켜고 라우팅을 테스트하는 실전 명령어입니다.
- 가상 환경 깨우기: .\venv\Scripts\activate (도트 백슬래시 브이엔비 스크립트 액티베이트)
- 성공하면 줄 맨 앞에 (venv)가 뜹니다!
- 서버 실행하기: uvicorn main:app --reload (유비콘 메인 땡땡 앱 대시대시 리로드)
- --reload를 붙여야 코드를 고칠 때마다 서버가 자동으로 다시 돕니다.
2 - 3. 라우팅 설계의 3가지 핵심 (기호 버전)
- 📍 고정 경로: @app.get("/items") - 정확히 /items로 올 때만 반응합니다.
- 🔢 경로 매개변수: @app.get("/items/{item_id}") - 주소창에 숫자를 넣으면 함수가 그 숫자를 낚아챕니다.
- 🔍 쿼리 매개변수: /items/?skip=0&limit=10 - 주소 뒤에 붙는 상세 옵션입니다.
2 - 4. Swagger UI: 코드가 자동으로 만드는 마법의 문서
**Swagger(스웨거)**는 내가 짠 API 코드를 읽어서, 남들이(혹은 미래의 내가) 보고 직접 테스트까지 해볼 수 있게 만든 **"자동 반응형 설명서"**입니다.
이건 개발자의 귀찮음을 한 방에 해결해 주는 FastAPI의 최대 복지이자 꽃입니다!
윈도우 터미널(CMD/PowerShell)에서 서버를 띄워놓고 바로 확인하는 법부터, 왜 이게 "사기급" 도구인지 진중하게 파헤쳐 보겠습니다.
| URL 주소 | http://127.0.0.1:8000/docs | / 독스 |
| 핵심 기능 | API 명세 확인 + 실시간 테스트 | 트라이 잇 아웃 (Try it out) |
| 대체 도구 | http://127.0.0.1:8000/redoc | / 리독 |
2 - 5. 윈도우 기반 스웨거 사용 로직 (기호 버전)
형님, 윈도우 터미널에서 서버를 띄운 상태여야 합니다!
- [Step 1] 🚀 서버 가동: uvicorn main:app --reload (유비콘 메인 땡땡 앱 대시대시 리로드)
- [Step 2] 🌐 브라우저 접속: 크롬이나 엣지를 열고 주소창에 localhost:8000/docs 입력!
- [Step 3] 🖱️ 테스트 시작:
- 원하는 API 클릭 ➡️ Try it out (트라이 잇 아웃) 버튼 클릭!
- 데이터 입력 후 ➡️ Execute (엑제큐트) 클릭!
- [Step 4] 📊 결과 확인: 밑에 Response(리스폰스) 칸에 서버가 준 답변이 실시간으로 뜹니다.
2 - 6. 왜 스웨거를 써야 하나요? (비교 분석)
| 문서 작성 | 워드나 엑셀에 일일이 타이핑 (극혐) | 코드 짜면 0.1초 만에 자동 생성 (극락) |
| 동작 테스트 | 별도 프로그램(Postman 등) 필요 | 웹브라우저 하나로 끝! |
| 데이터 형식 | 틀려도 실행해봐야 앎 | 입력창에서 미리 형식을 가이드해줌 |
🪟 윈도우 형님 팁: 가끔 윈도우 보안 설정 때문에 8000번 포트가 막히는 경우가 있습니다. 그럴 땐 당황하지 마시고 uvicorn main:app --reload --port 8080 처럼 포트 번호를 살짝 바꿔서 시도해 보세요!
/docs 들어가서 형님이 짠 API가 예쁘게 나열된 걸 보면 개발할 맛이 확 나실 겁니다.
3. 템플릿팅 (jinja2)
**Jinja2**라는 녀석을 만날 차례군요. 지금까지는 데이터만 휙휙 던졌다면, 이제는 그 데이터를 받아서 **예쁜 화면(HTML)**으로 그려주는 **Templating(템플릿팅)**의 세계입니다.
윈도우 환경에서 딱 맞춘 설치법부터, 진중하게 핵심 문법까지 싹 훑어드릴게요!
3 - 1. Jinja2: 파이썬 데이터를 HTML에 녹여내는 마법
Jinja2는 파이썬 전용 템플릿 엔진입니다. HTML 파일 안에 파이썬 변수나 반복문을 심어 넣을 수 있게 해 주죠.
| Templates | 템플릿츠 | HTML 뼈대가 담긴 파일들 (주로 templates/ 폴더) |
| Context | 컨텍스트 | 파이썬에서 HTML로 넘겨주는 "데이터 보따리" |
| Static Files | 스태틱 파일즈 | CSS, 이미지 같은 변하지 않는 정적 파일들 |
3 - 2. 윈도우 기반 환경 세팅 (명령어)
Jinja2를 쓰려면 패키지를 하나 더 설치해야 합니다. 윈도우 터미널(CMD/PowerShell)을 여세요!
- 가상 환경 켜기 (이미 켜져 있으면 패스!): .\venv\Scripts\activate (도트 백슬래시 브이엔비 스크립트 액티베이트)
- 진자 설치: pip install jinja2 aiofiles (핍 인스톨 진자투 에이아이오파일즈)
- FastAPI에서 HTML을 내보내려면 파일 읽기 도구(aiofiles)도 같이 있는 게 좋습니다!
3 - 3. Jinja2 핵심 문법 3 대장 (기호 버전)
HTML 파일 안에서 꼭 쓰게 될 3가지 기호입니다.
- [1] {{ variable }} (더블 컬리 브레이스 / 변수 출력)
- 파이썬에서 넘겨준 값을 화면에 뿌릴 때 씁니다. (예: {{ name }} 형님 환영합니다!)
- [2] {% logic %} (퍼센트 싸인 / 로직 실행)
- if문이나 for문 같은 조건/반복을 쓸 때 사용합니다. (끝날 땐 {% endif %}, {% endfor %} 필수!)
- [3] {# comment #} (샵 싸인 / 주석)
- 메모를 남길 때 씁니다. 화면에는 안 보이죠!
다음은 예시로 만든 todo.html 입니다 jinja의 쓰임이나 형식을 찾아보아요
{% extends "home.html" %}
{% block todo_container %}
<div class="container mt-5">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card shadow">
<div class="card-header bg-primary text-white">
<h3 class="mb-0"><i class="fas fa-plus-circle"></i> 새 할 일 추가</h3>
</div>
<div class="card-body">
<form method="post" action="/todo">
<div class="input-group">
<input type="text" name="item" class="form-control form-control-lg"
placeholder="새로운 일을 주쇼!!" required>
<div class="input-group-append">
<button class="btn btn-success" type="submit">
<i class="fas fa-save"></i> 추심
</button>
</div>
</div>
</form>
</div>
</div>
<div class="mt-5">
<h3><i class="fas fa-list-ul"></i> 할 일 목록</h3>
<hr>
<div class="list-group">
{% if todos %}
{% for todo in todos %}
<div class="list-group-item list-group-item-action d-flex justify-content-between align-items-center shadow-sm mb-2 rounded">
<div>
<span class="badge badge-secondary mr-2">ID: {{ todo.id }}</span>
<span class="h5 mb-0">{{ todo.item }}</span>
</div>
<div>
<button class="btn btn-sm btn-outline-danger" title="삭제">
<i class="fas fa-trash-alt"></i>
</button>
</div>
</div>
{% endfor %}
{% else %}
<div class="text-center py-5">
<p class="text-muted">아직 등록된 할 일이 없습니다. 첫 번째 할 일을 추가해 보세요!</p>
</div>
{% endif %}
</div>
</div>
{% if todos %}
<div class="mt-3 text-right">
<p class="text-muted small">총 {{ todos|length }}개의 할 일이 있습니다.</p>
</div>
{% endif %}
</div>
</div>
</div>
{% endblock %}
🪟 윈도우 형님 전용 팁: FastAPI 코드에서 Jinja2Templates(directory="templates")라고 폴더를 지정할 때, 윈도우 탐색기에서 templates 폴더를 프로젝트 루트(main.py가 있는 곳)에 꼭 만들어두셔야 합니다. 안 그러면 "폴더 못 찾겠다"고 징징거릴 거예요!
오늘은 여기까지 ~ ~
오늘 복습한 결과물입니다.

매번 공부하면서 느끼는 거지만 버전으로 인한 실행 불가는 정말 빡치게 만듭니다 제미나이를 유료화하고 싶은 맘이 하늘을 찔러요 정말 돈이 아까워서가 아니라 학습에 방해될까 봐 안 쓰고 있지만 코파일럿은 결재하고 싶네요 ㅎ
매번 매번으로 시작하지만 정말 정말 할수록 어려운 거 같아요 가르쳐 주시는 분이나 같이 학습하시는 분들 정말 부럽고 대단하십니다. 제미나이는 에러는 그냥 씹으면서 맞만 보고 가라는데 전 주식이 될 거 같아 너무 불안합니다 눈에 보이는 버전 차이는 아 ! 그러네 하고 코드를 고쳐 나가면 되지만 백엔드나 라이브러리 버전 차이는 아직까진 에이아이의 힘을 빌려 쓰고 있어요 왜 에이아이라고 졌는지 에이어르신이나 에이선생님으로 지었으면 양심에 들 부담 가는데 ㅎㅎ
오늘도 모자란 학습은 단어로 채워 보겠습니다 어원공부가 재미지거든요!
📚 단어 어원 공부
진중하게 어원도 챙겨가야 진정한 공부죠!
1. Template (템플릿 - 견본/박판)
- 어원: Latin templum (구획/판).
- 설명: 원래는 금속이나 나무를 자를 때 쓰는 본보기를 뜻합니다. 웹에서는 미리 짜놓은 HTML 뼈대를 말하죠!
2. Render (렌더 - 표현하다/주다)
- 어원: Latin re- (다시) + dare (주다).
- 설명: 데이터를 가공해서 완성된 화면으로 다시 내놓는 과정입니다. "화면을 렌더링한다"고 표현하죠.
3. Static (스태틱 - 정적인/변하지 않는)
- 어원: Greek statikos (세우다/정지시키다).
- 설명: 움직이지 않고 가만히 서 있는 상태입니다. 서버가 매번 계산할 필요 없이 그냥 그대로 보여주는 파일(이미지 등)을 뜻합니다.
4. Swagger (스웨거 - 으스대다/뽐내며 걷다)
- 어원: 16세기 노르웨이 방언 swag (흔들거리다)에서 유래.
- 설명: "내 API 좀 봐, 멋지지?"라고 뽐내는 느낌입니다. 원래는 당당하게 걷는 모습을 뜻하는데, 지금은 API 문서의 대명사가 됐죠!
5. Execute (엑제큐트 - 실행하다/수행하다)
- 어원: 라틴어 ex- (밖으로) + sequi (따르다).
- 설명: 끝까지 따라가서 밖으로 결과를 내놓는 것, 즉 명령을 실행한다는 뜻입니다. 버튼 누르면 서버가 일을 시작하죠!
6. Documentation (다큐멘테이션 - 문서화/기록)
- 어원: 라틴어 docere (가르치다).
- 설명: 남을 가르치기 위해 남겨놓은 기록, 즉 문서입니다. 스웨거는 세상에서 가장 똑똑한 자동 문서 도구입니다.
7. Routing (라우팅 - 길 찾기/노선 정하기)
- 어원: Old French route (길/통로)에서 유래.
- 설명: 숲속에 뚫린 길을 따라가듯, 데이터가 가야 할 경로를 정해주는 행위입니다.
8. Decorator (데코레이터 - 장식자)
- 어원: Latin decorare (아름답게 꾸미다).
- 설명: 파이썬에서 @ 기호를 쓰는 녀석이죠. 함수에 특별한 기능(라우팅 기능 등)을 덧씌워 장식해 준다는 뜻입니다.
9. Operation (오퍼레이션 - 작업/운용)
- 어원: Latin operari (일하다).
- 설명: 서버가 단순히 길만 찾는 게 아니라, 데이터를 읽을지(GET) 쓸지(POST) 구체적으로 어떤 작업을 할지 정하는 것입니다.
10. Virtual (버추얼 - 가상의/실질적인)
- 어원: 라틴어 virtus (힘/덕목/효력).
- 설명: 겉모습은 진짜가 아니지만, 그 "효력"이나 "기능"은 진짜와 똑같다는 뜻입니다. 진짜 파이썬은 아니지만 진짜처럼 동작하는 가상 공간이죠!
11. Environment (인바이런먼트 - 환경/주변)
- 어원: Old French en- (안에) + viron (주위/원).
- 설명: 주위를 둥글게 둘러싸고 있는 것들을 말합니다. 개발에 필요한 모든 도구가 나를 둘러싸고 있는 환경을 뜻하죠.
12. Activate (액티베이트 - 활성화하다/작동시키다)
- 어원: 라틴어 actus (행동/움직임).
- 설명: 멈춰있는 것을 움직이게 만든다는 뜻입니다. 잠자고 있는 가상 환경을 깨워서 실제로 사용 가능한 상태로 만드는 활성화 단계입니다!
단어도 딱 한 타스만 !!
본 후기는 [한글과 컴퓨터 x한국생산성본부 x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성되었습니다.
#한컴 AI아카데미 #AI개발자 #AI개발자교육 #한글과 컴퓨터 #한국생산성본부 #스나이퍼팩토리 #부트캠프 #AI전문가양성 #개발자교육 #개발자취업
'한컴 AI 아카데미' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴 AI아카데미 4기 프로젝트 1주차 (0) | 2026.05.09 |
|---|---|
| [스나이퍼팩토리] 한컴 AI아카데미 4기 14주차 딥러닝 (0) | 2026.04.10 |
| [스나이퍼팩토리] 한컴 AI아카데미 4기 12주차 파이썬 판다스(Pandas) (0) | 2026.03.27 |
| [스나이퍼팩토리] 한컴 AI아카데미 4기 11주차 파이썬 넘파이(Numpy) (0) | 2026.03.20 |
| [스나이퍼팩토리] 한컴 AI아카데미 4기 10주차 파이썬!!! (0) | 2026.03.13 |