FastAPI 서버개발, FastAPI의 확장 기능 및 플러그인 개발하기

FastAPI는 빠르고 현대적인 웹 프레임워크로, Python을 기반으로 RESTful API를 만드는데 최적화되어 있습니다. FastAPI는 뛰어난 성능과 직관적인 사용법 덕분에 많은 개발자들에게 사랑받고 있으며, 다양한 기능과 확장성 덕분에 복잡한 애플리케이션을 구축하는 데에도 유용합니다. 이번 글에서는 FastAPI의 확장 기능과 플러그인 개발에 대해 깊이 있게 탐구해 보겠습니다.

1. FastAPI의 기본 구조 이해하기

FastAPI를 사용하면 간단한 HTTP 엔드포인트를 신속하게 만들 수 있습니다. 다음은 FastAPI의 기본 구조를 보여주는 간단한 예제입니다.

from fastapi import FastAPI

app = FastAPI()

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

위의 코드는 가장 기본적인 FastAPI 서버를 설정하는 예제입니다. FastAPI() 객체를 생성하고, @app.get() 데코레이터를 사용하여 GET 요청에 대한 엔드포인트를 구현합니다.

2. FastAPI의 확장성 이해하기

FastAPI는 여러 가지 내장 기능을 제공하지만, 개발자는 종종 추가적인 기능을 필요로 하게 됩니다. FastAPI는 이러한 필요를 충족시키기 위해 다양한 방법으로 확장할 수 있는 구조를 갖추고 있습니다.

2.1. 의존성 주입과 확장

FastAPI는 의존성 주입 시스템을 통해 경량화된 확장을 지원합니다. 의존성을 정의하고 이를 사용할 수 있는 직접적인 방식으로, 다음과 같은 예제가 있습니다.

from fastapi import Depends

def get_query_param(q: str = None):
    return q

@app.get("/items/")
async def read_items(q: str = Depends(get_query_param)):
    return {"q": q}

위의 예에서 get_query_param 함수는 쿼리 파라미터를 가져오는 역할을 하며, Depends를 통해 이를 엔드포인트에 주입합니다.

2.2. Middleware의 활용

FastAPI는 미들웨어를 통해 요청과 응답을 처리하는 로직을 추가할 수 있습니다. 이 기능은 로깅, 인증, CORS 설정 등 다양한 용도로 활용할 수 있습니다. 다음은 미들웨어를 설정하는 예제입니다.

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/cors/")
async def cors_example():
    return {"message": "CORS 설정이 완료되었습니다."}

위의 코드는 모든 도메인에서 이 API에 대한 요청을 허용하도록 CORS 미들웨어를 설정하는 예입니다.

3. FastAPI 플러그인 개발하기

FastAPI의 확장 기능을 더욱 활용하려면 자체 플러그인을 개발할 수 있습니다. 플러그인은 FastAPI 애플리케이션에 독립적으로 배포 가능하며, 다른 프로젝트에서도 재사용할 수 있는 구성 요소입니다.

3.1. FastAPI 플러그인 구조

플러그인을 만드려면 FastAPI의 APIRouter를 활용해야 합니다. 플러그인을 만들기 위한 기본 구조는 다음과 같습니다.

from fastapi import APIRouter

router = APIRouter()

@router.get("/plugin/")
async def plugin_example():
    return {"message": "플러그인이 작동하고 있습니다."}

위의 코드는 플러그인의 기본적인 구조를 보여줍니다. 여기서 APIRouter를 활용하여 독립적인 엔드포인트를 정의할 수 있습니다.

3.2. 플러그인 통합하기

개발한 플러그인을 FastAPI 애플리케이션에 통합하기 위해서는 다음과 같이 설정할 수 있습니다.

from fastapi import FastAPI
from my_plugin import router as my_plugin_router  # 아까 만든 플러그인 임포트

app = FastAPI()

app.include_router(my_plugin_router)

위의 경우, my_plugin에서 정의한 라우터를 메인 애플리케이션에 통합하고 있습니다.

3.3. 플러그인에서 의존성 주입 사용하기

플러그인 내에서 의존성 주입을 활용하는것도 가능합니다. 아래는 플러그인에서 의존성을 사용하는 예제입니다.

def common_query_param(q: str = None):
    return q

@router.get("/plugin_with_dependency/")
async def plugin_with_dependency(q: str = Depends(common_query_param)):
    return {"message": f"수신된 쿼리: {q}"}

위의 예제는 플러그인 내에서 의존성 주입을 통해 쿼리 파라미터를 수신하는 방법을 보여줍니다.

4. FastAPI의 오픈API와 문서화

FastAPI는 OpenAPI를 지원하여 자동으로 API 문서를 생성할 수 있습니다. Swagger UI와 ReDoc와 같은 인터페이스를 통해 API를 테스트하고 문서화할 수 있습니다. 설정은 다음과 같습니다.

app = FastAPI(title="My API", description="이 API는 FastAPI로 만들어졌습니다.", version="1.0.0")

@app.get("/api/docs")
async def get_docs():
    return {"message": "문서화된 API에 접근합니다."}

위의 코드를 통해 API의 documentation URL을 설정하고, API 엔드포인트를 문서화하는 방법을 알 수 있습니다.

5. FastAPI와 데이터베이스 통합

FastAPI를 데이터베이스와 통합하는 것은 웹 애플리케이션 개발에서 중요한 부분입니다. SQLAlchemy와 같은 ORM(Object Relational Mapping)을 사용하여 데이터베이스와의 상호작용을 간편하게 구현할 수 있습니다.

5.1. SQLAlchemy와 FastAPI

다음은 SQLAlchemy를 FastAPI와 연결하는 기본 예제입니다.

from fastapi import FastAPI, Depends
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

DATABASE_URL = "sqlite:///./test.db"
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)

Base.metadata.create_all(bind=engine)

app = FastAPI()

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

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

위의 예제는 SQLite 데이터베이스를 사용하여 CRUD(Create, Read, Update, Delete) 작업을 수행하는 FastAPI 서버를 설정하는 방법을 보여줍니다.

6. FastAPI와 비동기 프로그래밍

FastAPI는 비동기 프로그래밍을 지원하여 높은 성능을 제공합니다. 데이터베이스 쿼리와 서버 간의 연결을 비동기로 처리하는 예제는 다음과 같습니다.

import asyncpg
from fastapi import FastAPI

app = FastAPI()

async def connect_db():
    conn = await asyncpg.connect(user='user', password='password', database='db', host='127.0.0.1')
    return conn

@app.get("/async-example/")
async def async_example():
    conn = await connect_db()
    row = await conn.fetch("SELECT * FROM items;")
    await conn.close()
    return row

위의 예제는 asyncpg 라이브러리를 사용하여 PostgreSQL과 비동기적으로 연결하는 예제입니다.

7. 결론

FastAPI는 RESTful API를 신속하게 개발할 수 있는 강력한 프레임워크입니다. 이번 글에서는 FastAPI의 확장 기능과 플러그인 개발 방법에 대해 살펴보았습니다. 의존성 주입, 미들웨어, 플러그인 구조 및 데이터베이스 통합, 비동기 프로그래밍 등 다양한 기능을 통해 FastAPI를 더욱 효과적으로 활용할 수 있습니다. 이러한 지식을 바탕으로 여러분의 프로젝트에서 FastAPI를 적용하고, 멋진 웹 애플리케이션을 만들어 보시기 바랍니다.

FastAPI와 함께 할 멋진 개발 경험을 쌓으시길 바랍니다!