FastAPI는 Python으로 웹 애플리케이션을 개발하기 위한 현대적인 프레임워크입니다. 이 글에서는 FastAPI를 사용하여 Docker와 PostgreSQL 데이터베이스를 결합한 RESTful API를 구축하는 방법을 소개하고, CRUD(Create, Read, Update, Delete) 중 Create 기능을 중점적으로 다룰 것입니다.
목차
FastAPI 소개
FastAPI는 Python의 비동기 처리를 활용하여 높은 성능을 자랑하는 웹 프레임워크입니다. FastAPI의 장점은 다음과 같습니다:
- 비동기 처리 지원: 웹 서버와의 I/O 작업을 비동기로 처리하여 성능을 최적화합니다.
- 자동화된 API 문서: Swagger UI와 ReDoc을 통한 자동화된 문서를 제공합니다.
- 유형 검사: Python 3.6 이상의 타입 힌트를 활용하여 데이터 유효성을 검사합니다.
환경 설정
시작하기에 앞서 필요한 패키지를 설치합니다. FastAPI와 PostgreSQL을 사용하여 API를 구축할 것이므로, 아래와 같은 환경을 설정합니다.
bash
# 가상환경 생성
$ python -m venv venv
$ source venv/bin/activate # macOS/Linux
$ venv\Scripts\activate # Windows
# 필요한 패키지 설치
(venv) $ pip install fastapi[all] sqlalchemy psycopg2
데이터베이스 통합
FastAPI에서 SQLAlchemy를 사용하여 PostgreSQL 데이터베이스와 통합할 것입니다. 아래는 데이터베이스 설정을 위한 코드입니다.
python
from fastapi import FastAPI
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "postgresql://username:password@localhost/dbname"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(String, index=True)
Base.metadata.create_all(bind=engine)
위 코드에서, `DATABASE_URL`을 실제 데이터베이스의 사용자명, 비밀번호, 호스트 및 데이터베이스 이름으로 수정해야 합니다.
Create 작업 구현
이제 Create 작업을 구현해 보겠습니다. 이를 위해 FastAPI의 경로 연산자와 Pydantic을 사용하여 데이터 유효성을 검사할 수 있습니다.
python
from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
from pydantic import BaseModel
app = FastAPI()
class ItemCreate(BaseModel):
name: str
description: str = None
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/items/", response_model=ItemCreate)
def create_item(item: ItemCreate, db: Session = Depends(get_db)):
db_item = Item(name=item.name, description=item.description)
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
이번에는 클라이언트가 “/items/” 엔드포인트로 POST 요청을 전달하면, 새로운 아이템이 데이터베이스에 추가되도록 설정했습니다.
전체 코드 보기
python
from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from pydantic import BaseModel
# 데이터베이스 설정
DATABASE_URL = "postgresql://username:password@localhost/dbname"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
# 아이템 모델
class Item(Base):
__tablename__ = "items"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
description = Column(String, index=True)
Base.metadata.create_all(bind=engine)
# FastAPI 인스턴스 생성
app = FastAPI()
# Pydantic 모델
class ItemCreate(BaseModel):
name: str
description: str = None
# 데이터베이스 세션 생성
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# 아이템 생성 경로
@app.post("/items/", response_model=ItemCreate)
def create_item(item: ItemCreate, db: Session = Depends(get_db)):
db_item = Item(name=item.name, description=item.description)
db.add(db_item)
db.commit()
db.refresh(db_item)
return db_item
API 테스트
FastAPI는 자동으로 Swagger UI 문서를 제공하므로, API를 테스트하기에 매우 용이합니다. 서버를 실행한 후 웹 브라우저에서 http://127.0.0.1:8000/docs
로 이동하면 API 문서를 확인할 수 있습니다.
bash
# 서버 실행
(venv) $ uvicorn main:app --reload
POST 요청 보내기
API 문서에서 “POST /items/” 엔드포인트를 선택하고, JSON 형식으로 데이터를 입력하여 테스트할 수 있습니다. 예를 들어:
{
"name": "example item",
"description": "This is an example item"
}
위 데이터를 전송하면, 데이터베이스에 새로운 아이템이 추가됩니다.
결론
이번 글에서는 FastAPI를 사용하여 PostgreSQL 데이터베이스와 통합하고 새로운 데이터를 생성하는 방법에 대해 설명했습니다. FastAPI의 간결한 문법과 강력한 기능 덕분에 빠르게 API를 개발할 수 있었습니다. 다음 단계로서는 Read, Update, Delete 작업을 구현하고, 인증 및 권한 부여와 같은 보안 기능을 추가하는 것을 고려할 수 있습니다.