안녕하세요! FastAPI와 PyCharm 개발 여정의 두 번째 이야기로 돌아왔어요! 🚀 지난 시간에는 기본 환경 설정과 첫 API를 만들어봤는데요, 오늘은 더 실용적인 API 엔드포인트를 만들어볼게요! 개발 초보자도 쉽게 따라할 수 있도록 차근차근 설명할게요! 😊
🔍 2편에서 배울 내용
- 경로 매개변수(Path Parameters) 사용하기
- 쿼리 매개변수(Query Parameters) 다루기
- Pydantic 모델로 데이터 검증하기
- 여러 엔드포인트 구성하기
📌 1. 경로 매개변수 사용하기
경로 매개변수는 URL 경로의 일부로 전달되는 변수예요. 예를 들어, 특정 사용자의 정보를 가져오는 /users/{user_id}
같은 형식이죠!
main.py
파일에 다음 코드를 추가해볼까요?
@app.get("/items/{item_id}")
def read_item(item_id: int):
return {"item_id": item_id, "message": f"아이템 {item_id}번을 가져왔어요! 🎁"}
여기서 item_id
는 경로 매개변수이고, : int
는 이 매개변수가 정수 타입이어야 한다는 것을 지정해요. FastAPI가 자동으로 타입 변환과 검증을 해준답니다! 😍
서버를 실행하고 브라우저에서 http://127.0.0.1:8000/items/42
와 같은 URL로 접속해보세요. 아이템 ID가 포함된 응답을 볼 수 있을 거예요!
📌 2. 쿼리 매개변수 다루기
쿼리 매개변수는 URL의 ?
뒤에 오는 key=value
형식의 매개변수예요. 예를 들어, /items?skip=0&limit=10
과 같은 형식이죠!
다음 코드를 추가해볼게요:
@app.get("/users/")
def read_users(skip: int = 0, limit: int = 10):
# 실제로는 데이터베이스에서 사용자 목록을 가져오겠지만, 지금은 예시로 더미 데이터를 사용해요
fake_users = [{"id": i, "name": f"사용자{i}"} for i in range(100)]
return fake_users[skip : skip + limit]
여기서 skip
과 limit
은 쿼리 매개변수예요. 기본값을 설정했기 때문에 선택적으로 사용할 수 있어요.
서버를 실행하고 다음 URL로 접속해보세요:
http://127.0.0.1:8000/users/
- 기본값인 처음 10명의 사용자를 반환http://127.0.0.1:8000/users/?skip=20&limit=5
- 21번째부터 5명의 사용자를 반환
📌 3. Pydantic 모델로 데이터 검증하기
FastAPI는 Pydantic 라이브러리를 사용해 데이터 검증을 수행해요. 요청과 응답의 데이터 구조를 정의하고 자동으로 검증할 수 있답니다! 🛡️
먼저, Pydantic 모델을 정의해볼게요:
from fastapi import FastAPI
from pydantic import BaseModel, Field
app = FastAPI()
class Item(BaseModel):
name: str
description: str = None
price: float = Field(..., gt=0)
tax: float = None
is_offer: bool = False
@app.post("/items/")
def create_item(item: Item):
return {"item_name": item.name, "price_with_tax": item.price + (item.tax or 0)}
여기서 Item
클래스는 Pydantic 모델로, API 요청 본문(request body)의 구조를 정의해요.
name
: 필수 문자열 필드description
: 선택적 문자열 필드price
: 필수 실수 필드, 0보다 커야 함tax
: 선택적 실수 필드is_offer
: 선택적 불리언 필드, 기본값은 False
이제 /items/
경로로 POST 요청을 보내면, FastAPI가 요청 본문을 자동으로 검증하고 Item
객체로 변환해줍니다! 🎯
📌 4. 여러 엔드포인트 구성하기
이제 배운 내용을 종합해서 간단한 할 일 목록(Todo) API를 만들어볼게요! 😃
from fastapi import FastAPI, HTTPException, status
from pydantic import BaseModel
from typing import List, Optional
import uuid
app = FastAPI()
# Todo 아이템을 위한 Pydantic 모델
class TodoCreate(BaseModel):
title: str
description: Optional[str] = None
completed: bool = False
class Todo(TodoCreate):
id: str
# 임시 데이터 저장소 (실제로는 데이터베이스를 사용할 거예요)
todos = {}
@app.post("/todos/", response_model=Todo, status_code=status.HTTP_201_CREATED)
def create_todo(todo: TodoCreate):
todo_id = str(uuid.uuid4())
todos[todo_id] = Todo(id=todo_id, **todo.dict())
return todos[todo_id]
@app.get("/todos/", response_model=List[Todo])
def read_todos(skip: int = 0, limit: int = 10):
return list(todos.values())[skip: skip + limit]
@app.get("/todos/{todo_id}", response_model=Todo)
def read_todo(todo_id: str):
if todo_id not in todos:
raise HTTPException(status_code=404, detail="할 일을 찾을 수 없어요! 😢")
return todos[todo_id]
@app.put("/todos/{todo_id}", response_model=Todo)
def update_todo(todo_id: str, todo: TodoCreate):
if todo_id not in todos:
raise HTTPException(status_code=404, detail="할 일을 찾을 수 없어요! 😢")
todos[todo_id] = Todo(id=todo_id, **todo.dict())
return todos[todo_id]
@app.delete("/todos/{todo_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_todo(todo_id: str):
if todo_id not in todos:
raise HTTPException(status_code=404, detail="할 일을 찾을 수 없어요! 😢")
del todos[todo_id]
return None
여기서 우리는 다음과 같은 엔드포인트를 만들었어요:
- POST /todos/: 새로운 할 일 생성
- GET /todos/: 모든 할 일 목록 조회
- GET /todos/{todo_id}: 특정 할 일 조회
- PUT /todos/{todo_id}: 특정 할 일 수정
- DELETE /todos/{todo_id}: 특정 할 일 삭제
이렇게 하면 기본적인 CRUD(Create, Read, Update, Delete) 기능을 갖춘 API가 완성됩니다! 🎉
💡 API 테스트하기
FastAPI의 자동 생성 문서를 이용해 우리가 만든 API를 테스트해볼 수 있어요. 서버를 실행하고 http://127.0.0.1:8000/docs
로 접속해보세요!
각 엔드포인트에 대한 "Try it out" 버튼을 클릭하고 매개변수나 요청 본문을 입력한 다음 "Execute" 버튼을 눌러 API를 테스트할 수 있어요. 정말 편리하죠? 👍
🎁 마무리
오늘은 FastAPI를 이용해 다양한 형태의 엔드포인트를 만들고, 경로 매개변수, 쿼리 매개변수, 요청 본문 등을 다루는 방법을 알아봤어요! 또한 Pydantic 모델을 이용해 데이터 검증도 해봤죠! 🌈
다음 3편에서는 데이터베이스 연결 방법과 더 복잡한 CRUD 작업을 다루는 방법을 알아볼 예정이에요. 기대해주세요! 💕
👩💻 배워볼 키워드 미리보기
- SQLAlchemy를 이용한 데이터베이스 연결
- ORM(Object-Relational Mapping) 개념
- 비동기 데이터베이스 작업
- 의존성 주입(Dependency Injection)
궁금한 점이나 질문이 있으시면 댓글로 남겨주세요! 다음 글에서 만나요~ 😊🚀
'개발' 카테고리의 다른 글
🌈 PyCharm으로 시작하는 FastAPI 개발 여정 (초보자를 위한 가이드) 4편 ✨ (0) | 2025.03.21 |
---|---|
PyCharm으로 시작하는 FastAPI 개발 여정 (초보자를 위한 가이드) 3편 ✨ (0) | 2025.03.20 |
🌈 PyCharm으로 시작하는 FastAPI 개발 여정 (초보자를 위한 가이드) 1편 ✨ (0) | 2025.03.18 |
🌈 초보자를 위한 PyCharm으로 웹 스크래핑 시작하기 (3/3) (0) | 2025.03.17 |
🌈 초보자를 위한 PyCharm으로 웹 스크래핑 시작하기 (2/3) (0) | 2025.03.16 |