๐Ÿš€ FastAPI + uv ๋กœ Todo App API ๋งŒ๋“ค๊ธฐ (๊ฐ€์žฅ ๊น”๋”ํ•œ ๋ฐฉ๋ฒ•!)

๋ฐœํ–‰: (2025๋…„ 12์›” 27์ผ ์˜ค์ „ 06:04 GMT+9)
2 min read
์›๋ฌธ: Dev.to

Source: Dev.to

Introduction

๋ฒˆ๊ฐœ์ฒ˜๋Ÿผ ๋น ๋ฅธ API๋ฅผ Python ํŒจํ‚ค์ง• ํ˜ผ๋ž€ ์—†์ด ๋งŒ๋“ค๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?
์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” FastAPI์™€ uv๋ฅผ ์‚ฌ์šฉํ•ด Todo API๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. uv๋Š” ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์˜์กด์„ฑ ํ•ด๊ฒฐ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ž‘์—…์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š” ์ฐจ์„ธ๋Œ€ Python ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ž…๋‹ˆ๋‹ค.

What is uv?

uv๋Š” pip๊ณผ virtualenv๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ํ˜„๋Œ€์ ์ธ Python ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ, ๋‹ค์Œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ๐Ÿš€ ์ดˆ๊ณ ์† ์˜์กด์„ฑ ์„ค์น˜
  • ๐Ÿ“ฆ ์ž๋™ ๊ฐ€์ƒ ํ™˜๊ฒฝ ์ƒ์„ฑ
  • ๐Ÿงผ requirements.txt ์—†์ด ๊น”๋”ํ•œ ํ”„๋กœ์ ํŠธ ์„ค์ •

Rust๋กœ ๊ตฌํ˜„๋˜์–ด ๋น ๋ฅด๊ณ  ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ Python ์›Œํฌํ”Œ๋กœ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹คโ€”API, CLI ๋„๊ตฌ, ๋ฐ์ดํ„ฐ ์•ฑ์— ์•ˆ์„ฑ๋งž์ถค์ž…๋‹ˆ๋‹ค.

Project Setup

mkdir fastapi-todo && cd fastapi-todo
uv init --app
uv add fastapi --extra standard

Define the data model (models.py)

# models.py
from pydantic import BaseModel

class Todo(BaseModel):
    id: int
    title: str
    completed: bool = False

Build the FastAPI application (main.py)

# main.py
from fastapi import FastAPI, HTTPException
from models import Todo

app = FastAPI()
todos: list[Todo] = []

@app.get("/")
def home():
    return {"message": "Welcome to the FastAPI Todo App"}

@app.get("/todos")
def list_todos():
    return todos

@app.post("/todos", status_code=201)
def add_todo(todo: Todo):
    if any(t.id == todo.id for t in todos):
        raise HTTPException(status_code=400, detail="Todo with this ID already exists.")
    todos.append(todo)
    return todo

@app.put("/todos/{todo_id}")
def update(todo_id: int, updated: Todo):
    for i, t in enumerate(todos):
        if t.id == todo_id:
            todos[i] = updated
            return updated
    raise HTTPException(status_code=404, detail="Todo not found")

@app.delete("/todos/{todo_id}")
def delete(todo_id: int):
    global todos
    todos = [t for t in todos if t.id != todo_id]
    return {"message": "Todo deleted"}

Run the application

uv run fastapi dev

์„œ๋ฒ„๋Š” http://127.0.0.1:8000์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
Explore the interactive API docs at .

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

40์ฃผ ์ค‘ 4์ฃผ โ€“ React, TypeScript, Python์„ ์‚ฌ์šฉํ•œ ์ฒซ ํ’€์Šคํƒ ์•ฑ

์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ ์ด๋ฒˆ ์ฃผ์˜ ๋ชฉํ‘œ๋Š” ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ํ–ฅํ•œ ๋‹ค์Œ ์‹ค์งˆ์ ์ธ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ •์  ํŽ˜์ด์ง€์— ์žˆ๊ฑฐ๋‚˜ ...

์™œ ๋‚˜๋Š” JavaScript, Python, ๊ทธ๋ฆฌ๊ณ  NPM์„ Rust๋กœ ๋ฐ”๊ฟจ๋Š”๊ฐ€ (๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ๋„ ๊ทธ๋ž˜์•ผ ํ•ฉ๋‹ˆ๋‹ค)

๋ธŒ๋ ˆ์ดํ‚น ํฌ์ธํŠธ ์ƒˆ๋ฒฝ 3์‹œ์˜€๋‹ค. ๋‚˜๋Š” ํ™”๋ฉด์„ ์‘์‹œํ•˜๋ฉฐ npm install์ด 47,000๋ฒˆ์งธ ์˜์กด์„ฑ์„ ํ†ต๊ณผํ•˜๋Š” ๋ชจ์Šต์„ ์ง€์ผœ๋ณด๊ณ  ์žˆ์—ˆ๋‹ค. ๋‚ด React ์•ฑ์€ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ„๋‹จํ•œ date pic์ด ํ•„์š”ํ–ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ โ€“ ์„ค์น˜, ๊ธฐ๋ณธ ์„œ๋ฒ„, ๊ฒฝ๋กœ ๋ฐ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ | Litestar๋กœ API ๊ตฌ์ถ• #1

๊ฐœ์š” Litestar๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ํ˜„๋Œ€์ ์ด๋ฉฐ ๊ฐ€๋ฒผ์šด Python ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ API์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์ตœ์ ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š”...