Python 샘플 HTTP CRUD with FastAPI와 Flask
Source: Dev.to
위의 링크에 있는 전체 텍스트를 제공해 주시면, 해당 내용을 한국어로 번역해 드리겠습니다. (코드 블록이나 URL은 그대로 유지됩니다.)
소개
파이썬 웹 개발 세계에서 CRUD(Create, Read, Update, Delete)는 거의 모든 애플리케이션의 기본이자 핵심입니다. 초보자에게 첫 번째 장벽은 로직이 아니라 도구입니다. 10년 넘게 업계 표준으로 자리 잡은 신뢰할 수 있는 “마이크로‑프레임워크” Flask를 선택할까요? 아니면 개발 세계를 강타하고 있는 고성능 신예 FastAPI를 선택할까요?
가장 큰 차이는 보통 실행 방식에 있습니다. FastAPI는 비동기 기능을 처리하기 위해 uvicorn 같은 외부 서버가 필요하지만, Flask는 빠른 로컬 개발을 위해 자체 내장 서버를 제공합니다.
FastAPI 예제 (fastapi_server.py)
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Dict
app = FastAPI()
# Data Schema
class User(BaseModel):
name: str
email: str
# In-memory "Database"
db: Dict[int, User] = {}
@app.post("/users/{user_id}")
def create_user(user_id: int, user: User):
if user_id in db:
raise HTTPException(status_code=400, detail="User already exists")
db[user_id] = user
return {"status": "Created", "data": user}
@app.get("/users/{user_id}")
def read_user(user_id: int):
if user_id not in db:
raise HTTPException(status_code=404, detail="User not found")
return db[user_id]
@app.put("/users/{user_id}")
def update_user(user_id: int, user: User):
if user_id not in db:
raise HTTPException(status_code=404, detail="User not found")
db[user_id] = user
return {"status": "Updated", "data": user}
@app.delete("/users/{user_id}")
def delete_user(user_id: int):
if user_id not in db:
raise HTTPException(status_code=404, detail="User not found")
del db[user_id]
return {"status": "Deleted"}
# To run: uvicorn fastapi_server:app --reload
FastAPI 테스트 (test_fastapi.py)
import requests
BASE = "http://127.0.0.1:8000/users"
# POST
print("POST:", requests.post(f"{BASE}/1", json={"name": "Alice", "email": "alice@web.com"}).json())
# GET
print("GET:", requests.get(f"{BASE}/1").json())
# PUT
print("PUT:", requests.put(f"{BASE}/1", json={"name": "Alice Smith", "email": "alice@web.com"}).json())
# DELETE
print("DELETE:", requests.delete(f"{BASE}/1").json())
Flask 예제 (flask_server.py)
from flask import Flask, request, jsonify
app = Flask(__name__)
# In-memory "Database"
db = {}
@app.route('/users/', methods=['POST'])
def create_user(user_id):
if user_id in db:
return jsonify({"error": "Exists"}), 400
db[user_id] = request.json
return jsonify({"status": "Created", "data": db[user_id]}), 201
@app.route('/users/', methods=['GET'])
def read_user(user_id):
user = db.get(user_id)
return jsonify(user) if user else (jsonify({"error": "Not found"}), 404)
@app.route('/users/', methods=['PUT'])
def update_user(user_id):
if user_id not in db:
return jsonify({"error": "Not found"}), 404
db[user_id] = request.json
return jsonify({"status": "Updated", "data": db[user_id]})
@app.route('/users/', methods=['DELETE'])
def delete_user(user_id):
if user_id in db:
del db[user_id]
return jsonify({"status": "Deleted"})
return jsonify({"error": "Not found"}), 404
if __name__ == '__main__':
# Built-in server (No uvicorn needed)
app.run(port=5000, debug=True)
Flask 테스트 (test_flask.py)
import requests
BASE = "http://127.0.0.1:5000/users"
# POST
print("POST:", requests.post(f"{BASE}/1", json={"name": "Bob", "email": "bob@web.com"}).json())
# GET
print("GET:", requests.get(f"{BASE}/1").json())
# PUT
print("PUT:", requests.put(f"{BASE}/1", json={"name": "Bob Jones", "email": "bob@web.com"}).json())
# DELETE
print("DELETE:", requests.delete(f"{BASE}/1").json())
어느 것을 선택해야 할까요?
두 가지를 모두 직접 사용해 보았으니, 선택은 프로젝트 목표에 따라 달라집니다:
- Flask 선택: 코드 한 줄 한 줄을 완전히 제어하고,
python app.py하나의 명령으로 앱을 실행하고 싶을 때, 간단하고 가벼운 설정을 원한다면. - FastAPI 선택: 확장이 필요한 현대적인 애플리케이션을 만들고 있거나, 자동 데이터 검증과 즉시 인터랙티브한 문서를 좋아한다면.