FastAPI 서버개발, DB 조작, C Create

FastAPI는 Python으로 웹 애플리케이션을 개발하기 위한 현대적인 프레임워크입니다. 이 글에서는 FastAPI를 사용하여 Docker와 PostgreSQL 데이터베이스를 결합한 RESTful API를 구축하는 방법을 소개하고, CRUD(Create, Read, Update, Delete) 중 Create 기능을 중점적으로 다룰 것입니다.

목차

  1. FastAPI 소개
  2. 환경 설정
  3. 데이터베이스 통합
  4. Create 작업 구현
  5. API 테스트
  6. 결론

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
    
주의: 필요에 따라 PostgreSQL을 설치하고 데이터베이스를 생성해야 합니다.

데이터베이스 통합

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 작업을 구현하고, 인증 및 권한 부여와 같은 보안 기능을 추가하는 것을 고려할 수 있습니다.