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 테스트 가능)
2. 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 확인
':: Back-end' 카테고리의 다른 글
| 클라우드 리눅스 서버에 Github ssh 인증키 생성 & 등록하기 (2) | 2025.07.14 |
|---|---|
| 리눅스에 Nginx, Certbot 설정하고 https ssh 인증서 발급하기 (1) | 2025.07.11 |
| 네이버 클라우드 플랫폼 NCP 서버 비밀번호 설정하기 (3) | 2025.07.11 |
| 네이버 클라우드 플랫폼 NCP 에서 서버 생성하기 (4) | 2025.07.11 |
| 가상환경 관리도구와 패키지 관리 매니저의 차이 (2) | 2025.02.17 |