본문 바로가기
개발

🌈 PyCharm으로 시작하는 FastAPI 개발 여정 (초보자를 위한 가이드) 2편 ✨

by D-Project 2025. 3. 19.

안녕하세요! FastAPI와 PyCharm 개발 여정의 두 번째 이야기로 돌아왔어요! 🚀 지난 시간에는 기본 환경 설정과 첫 API를 만들어봤는데요, 오늘은 더 실용적인 API 엔드포인트를 만들어볼게요! 개발 초보자도 쉽게 따라할 수 있도록 차근차근 설명할게요! 😊

🔍 2편에서 배울 내용

  1. 경로 매개변수(Path Parameters) 사용하기
  2. 쿼리 매개변수(Query Parameters) 다루기
  3. Pydantic 모델로 데이터 검증하기
  4. 여러 엔드포인트 구성하기

📌 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]

여기서 skiplimit은 쿼리 매개변수예요. 기본값을 설정했기 때문에 선택적으로 사용할 수 있어요.

서버를 실행하고 다음 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

여기서 우리는 다음과 같은 엔드포인트를 만들었어요:

  1. POST /todos/: 새로운 할 일 생성
  2. GET /todos/: 모든 할 일 목록 조회
  3. GET /todos/{todo_id}: 특정 할 일 조회
  4. PUT /todos/{todo_id}: 특정 할 일 수정
  5. 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)

궁금한 점이나 질문이 있으시면 댓글로 남겨주세요! 다음 글에서 만나요~ 😊🚀