FastAPI 서버개발, FastAPI 애플리케이션 구조화, 라우트 구현

FastAPI는 현대적인 웹 API 개발을 위한 프레임워크로, Python 언어를 기반으로 하여 비동기 프로그래밍을 지원합니다. FastAPI의 주요 장점 중 하나는 높은 성능을 유지하면서도 개발자가 직관적으로 이해하고 사용할 수 있도록 돕는 강력한 타입 시스템과 자동화된 문서 생성 기능입니다. 이 글에서는 FastAPI 서버를 개발하고 애플리케이션 구조화 방법, 그리고 라우트 구현에 대해 자세히 설명하고 예제 코드를 제공합니다.

1. FastAPI란?

FastAPI는 웹 애플리케이션의 백엔드 API를 쉽게 구축할 수 있도록 해주는 Python 프레임워크입니다. 다음과 같은 특징이 있습니다:

  • 빠른 성능: Starlette를 기반으로 하며, 비동기적이고 빠른 실행 속도를 가지고 있습니다.
  • 자동 문서 생성: Swagger UI 및 ReDoc을 통한 자동 API 문서화를 지원합니다.
  • 타입 힌팅: Python 3.6 이상의 타입 힌팅을 사용하여 코드 가독성과 유지 보수성을 높입니다.

2. FastAPI로 서버 개발 시작하기

FastAPI 설치는 간단합니다. pip를 사용하여 FastAPI와 uvicorn을 설치할 수 있습니다:

pip install fastapi uvicorn

3. 기본 FastAPI 애플리케이션 구조

FastAPI 애플리케이션은 다음과 같은 구조로 구성될 수 있습니다:

  • main.py: FastAPI 애플리케이션의 진입점입니다.
  • routers: 다양한 API 라우트를 정의하는 모듈입니다.
  • models: 데이터베이스 모델 및 Pydantic 모델을 정의하는 모듈입니다.
  • schemas: 요청 및 응답 모델을 정의하는 Pydantic 스키마입니다.
  • services: 비즈니스 로직을 처리하는 모듈입니다.

3.1 기본 FastAPI 애플리케이션 코드

아래 코드는 FastAPI의 기본 애플리케이션 구조를 보여줍니다:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

4. FastAPI 애플리케이션 라우팅

FastAPI에서 라우팅은 웹 경로와 HTTP 메서드(GET, POST, PUT, DELETE 등)에 따라 클라이언트의 요청을 처리하는 방식을 정의합니다. FastAPI는 각 라우트에 대한 HTTP 메서드를 데커레이터 형태로 작성할 수 있게 해줍니다.

4.1 라우트 구현하기

라우트를 구현하기 위해 FastAPI에 내장된 여러 데커레이터를 사용할 수 있습니다. 예를 들어, 클라이언트가 “/items/{item_id}” 경로로 GET 요청을 보낼 때 특정 아이템을 반환하는 라우트를 아래와 같이 정의할 수 있습니다:

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

4.2 다양한 HTTP 메서드 사용하기

FastAPI는 GET, POST, PUT, DELETE와 같은 다양한 HTTP 메서드를 지원합니다. 아래 예제는 POST 요청을 처리하여 클라이언트로부터 입력 받은 데이터를 반환하는 라우트를 보여줍니다:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

@app.post("/items/")
async def create_item(item: Item):
    return item

5. FastAPI 라우터로 애플리케이션 구조화하기

대규모 애플리케이션에서는 모든 라우트를 main.py 파일에 정의하는 것보다 모듈화하여 관리하는 것이 효율적입니다. FastAPI에서는 `APIRouter`를 사용하여 라우트 그룹을 만들 수 있습니다.

5.1 라우터 설정하기

프로젝트 구조를 다음과 같이 설정합니다:

  • app/
    • main.py
    • routers/
      • items.py
    • models/
      • item.py

5.2 items.py 라우터 구현

items.py 파일에서 아이템 관련 모든 라우트를 정의합니다:

from fastapi import APIRouter
from models.item import Item

router = APIRouter()

@router.post("/items/")
async def create_item(item: Item):
    return item

@router.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

5.3 main.py 파일에서 라우터 포함시키기

라우터를 main.py에 포함시켜 사용합니다:

from fastapi import FastAPI
from routers.items import router as items_router

app = FastAPI()

app.include_router(items_router, prefix="/items", tags=["items"])

6. FastAPI와 데이터베이스 연동하기

FastAPI 애플리케이션에서 데이터베이스와 연동하는 것은 자주 필요하는 기능입니다. 아래 코드는 SQLAlchemy와 FastAPI를 통합하여 데이터베이스와 상호작용하는 방법을 보여줍니다.

6.1 SQLAlchemy 설치하기

SQLAlchemy와 데이터베이스 드라이버를 설치합니다:

pip install sqlalchemy databases

6.2 데이터베이스 연결 설정

database.py 파일을 생성하고 데이터베이스 연결을 설정합니다:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
metadata = MetaData()
Base = declarative_base()

6.3 모델 정의하기

models/item.py에서 데이터베이스 모델을 정의합니다:

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

class Item(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    price = Column(Integer)

6.4 CRUD 작동 구현하기

서비스 계층에 CRUD 작동을 구현합니다:

from sqlalchemy.orm import Session
from models.item import Item

def get_item(db: Session, item_id: int):
    return db.query(Item).filter(Item.id == item_id).first()

def create_item(db: Session, item: Item):
    db.add(item)
    db.commit()
    db.refresh(item)
    return item

7. FastAPI 애플리케이션 실행하기

FastAPI 애플리케이션을 실행하기 위해 다음 명령어를 사용합니다:

uvicorn main:app --reload

8. 결론

FastAPI는 훌륭한 성능과 직관적인 코드 작성을 제공하는 웹 API 프레임워크입니다. 본 강좌에서는 FastAPI를 사용하여 서버를 개발하고 애플리케이션 구조화 방법, 라우트 구현에 대해 다루었습니다. FastAPI가 제공하는 다양한 기능들을 활용하여 보다 나은 웹 애플리케이션을 구축할 수 있기를 바랍니다.

9. 추가 자료

FastAPI 공식 문서에서 더 많은 정보와 자료를 확인할 수 있습니다: FastAPI Documentation