FastAPI는 python 백엔드 개발에 이용되는 프레임워크이다. 가볍고 빠르게 만들 수 있으면서도 높은 성능, 비동기지원, 자동문서 생성 등 장점이 많아 널리 이용되고 있는 프레임워크이다.

 

나 역시 간단한 api 서버를 만들기 위해 파이썬과 FastAPI 조합을 이용해보기로 결정하고, 초반 세팅 작업을 기록해본다.

 

 

🎯 단계별 순서

단계 설명
✅ FastAPI 설치 pip install fastapi uvicorn
✅ 기본 API 만들기 @app.get("/")
✅ Swagger 문서 확인 /docs
✅ Pydantic으로 데이터 검증 BaseModel 사용
✅ SQLite + SQLAlchemy 연결 데이터베이스 연동
✅ CRUD API 구현 GET, POST, PUT, DELETE
✅ Docker로 배포 Dockerfile 작성 후 docker build

 

 

 

1️⃣ FastAPI 프로젝트 기본 설정

FastAPI 프로젝트를 위한 가상환경을 만들고, 필요한 패키지를 설치

1. 가상환경 생성 및 활성화

터미널에서 아래 명령어 실행:

mkdir fastapi-project && cd fastapi-project # 프로젝트 폴더 생성 및 이동
python -m venv venv # 가상환경 생성
source venv/bin/activate # (Windows는 `venv\Scripts\activate`)

2. FastAPI 및 Uvicorn 설치

pip install fastapi uvicorn
  • fastapi: FastAPI 프레임워크
  • uvicorn: FastAPI 서버 실행을 위한 ASGI 서버(비동기 서버 게이트웨이 인터페이스)

 

2️⃣ FastAPI 서버 실행

📂 main.py 파일을 만들고 테스트코드 작성

from fastapi import FastAPI

app = FastAPI() # 앱 객체 생성

@app.get("/")   # 라우터
def read_root():
	return {"message": "Hello, FastAPI!"}

3. FastAPI 서버 실행

uvicorn main:app --reload
  • --reload: 코드 변경 시 자동으로 서버 재시작

4. API 테스트

브라우저에서 아래 url에 접속하여 JSON 응답이 정상적으로 나오는지 확인
👉 http://127.0.0.1:8000/

 
 

3️⃣ API 엔드포인트 추가

1. 새로운 API 엔드포인트 (/items/{item_id}) 추가

📂 main.py

# 변수 파라미터를 url로 받을 수 있는 엔드포인트 추가
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
	return {"item_id": item_id, "query": q}

👉 http://127.0.0.1:8000/items/5?q=hello

 
 
  • item_id: int → 경로 매개변수 (숫자로 변환)
  • q: str = None → 선택적 쿼리 매개변수

 

4️⃣ FastAPI 자동 문서 기능

FastAPI는 자동으로 API 문서를 생성 가능

 

1. Swagger UI (API 테스트 가능)

👉http://127.0.0.1:8000/docs

2. ReDoc 문서

👉http://127.0.0.1:8000/redoc

 

 

5️⃣ POST 요청 (데이터 받기)

📂 main.py

from pydantic import BaseModel

class Item(BaseModel):
	name: str
    price: float
    is_offer: bool = False
    
@app.post("/items/")
def create_item(item: Item):
	return {"message": f"Item '{item.name}' with price {item.price} created!"}
  • pydantic: 파이썬의 type annotation을 이용해 데이터 검증과 설정관리를 해주는 라이브러리

 

6️⃣ 데이터베이스 연동 (SQLite + SQLAlchemy)

FastAPI에서 SQLAlchemy를 사용하여 데이터베이스와 연동해 보자.

1. 필요한 패키지 설치

pip install sqlalchemy databases sqlite

2. 데이터베이스 설정 (database.py)

📂 database.py

from sqlalchemy import create_engine, Column, Integer, String, Float, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

def get_db():
	db = SessionLocal()
    try:
    	yield db
    finally:
    	db.close()

3. 데이터 모델 (models.py)

📂 models.py

from database import Base
from sqlalchemy import Column, Integer, String, Float, Boolean

class Item(Base):
	__tablename__ = "items"
    
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    price = Column(Float)
    is_offer = Column(Boolean, default=False)

4. 데이터베이스 테이블 생성

📂 main.py

from database import engine
import models

models.Base.metadata.create_all(bind=engine)
 

7️⃣ CRUD API 만들기

1. GET 모든 데이터 가져오기

from fastapi import Depends
from sqlalchemy.orm import Session
from database import get_db import models

@app.get("/items/")
def read_items(db: Session = Depends(get_db)):
	return db.query(models.Item).all()

2. POST 데이터 추가

@app.post("/items/")
def create_item(item: Item, db: Session = Depends(get_db)):
	db_item = models.Item(name=item.name, price=item.price, is_offer=item.is_offer)
	db.add(db_item)
	db.commit()
	db.refresh(db_item)
	return db_item

 

 

8️⃣ FastAPI + Docker 배포

1. Dockerfile 생성

📂 Dockerfile

FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir fastapi uvicorn sqlalchemy databases sqlite
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

2. Docker 이미지 빌드

docker build -t fastapi-app .

3. Docker 컨테이너 실행

docker run -p 8000:8000 fastapi-app

 

API 확인

👉 http://127.0.0.1:8000/docs

+ Recent posts