Inflearn brand logo image

인프런 커뮤니티 질문&답변

moljin님의 프로필 이미지
moljin

작성한 질문수

FastAPI: Python으로 3배 빠르게, 2배 정확한, 10배 빠른 API 만들기

CRUD관련: async def get_db() 관련

작성

·

42

·

수정됨

0

강의에서는 비동기적으로 engine을 만들때, 아래 처럼

engine = create_async_engine(
    DATABASE_URL,
    echo=True,
    future=True, # SQLAlchemy 2.0
    # encoding="utf-8"
)

했는데.... poolclass=QueuePool를 사용하여, DB 연결을 풀링하여 재사용하는 것이 도움이 될 듯한데... 강의에서는 언급이 없으셔서, AI에게 물어봤더니...

"FastAPI에서 create_async_engine과 함께 QueuePool을 사용하는 것은 비동기 데이터베이스 연결을 효율적으로 관리하기 위함입니다. QueuePool은 데이터베이스 연결을 풀링하여 재사용함으로써, 매번 새로운 연결을 생성하고 종료하는 오버헤드를 줄여줍니다. 특히 FastAPI와 같이 비동기 요청을 처리하는 환경에서는 여러 연결을 동시에 관리해야 하므로, 풀링은 성능 향상에 큰 도움이 됩니다."

이렇게 답을 주고...

from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.pool import QueuePool

DATABASE_URL = "your_database_url"  # 예: postgresql+asyncpg://user:password@host:port/database

engine = create_async_engine(
    DATABASE_URL,
    poolclass=QueuePool,
    pool_size=10,  # 풀에 유지할 연결 수
    max_overflow=20, # 풀 크기가 초과될 때 허용할 추가 연결 수
    pool_recycle=3600, # 초 단위로 연결을 재활용할 시간 (초과 시 재연결)
    echo=True  # SQL 실행 로그 출력 (디버깅용)
)

# 이후 엔진을 사용하여 데이터베이스 작업 수행

예시코드로 이렇게 주던데...

실제로, 비동기적으로 engine을 만들때에 AI의 답변처럼 도움이 되나요?

저희 강의의 코드는 아래와 같은 흐름을 타고 있던데...

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker, declarative_base
from typing import AsyncGenerator

from sqlalchemy.orm import configure_mappers

configure_mappers()

DATABASE_URL = "sqlite+aiosqlite:///./sql_app.db?charset=utf8"

engine = create_async_engine(
    DATABASE_URL,
    echo=True,
    future=True, # SQLAlchemy 2.0
    # encoding="utf-8"
)

from sqlalchemy.ext.asyncio import async_sessionmaker

AsyncSessionLocal = async_sessionmaker(
    engine,
    class_=AsyncSession, # add
    expire_on_commit=False,
    autocommit=False,
    autoflush=False
)


Base = declarative_base()

async def get_db() -> AsyncGenerator[AsyncSession, None]:
    session: AsyncSession = AsyncSessionLocal()
    print(f"async def get_db(): Session created: {session}")
    try:
        yield session
    except Exception as e:
        print(f"Session rollback triggered due to exception: {e}")
        await session.rollback()
        raise
    finally:
        print(f"async def get_db(): Closing session: {session}")
        await session.close()

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
moljin님, FastAPI에서 비동기적으로 데이터베이스 연결을 관리할 때 QueuePool을 사용하는 것이 성능 향상에 도움이 될 수 있습니다. QueuePool은 데이터베이스 연결을 일정한 수로 풀링하여, 매번 새로운 연결을 생성하고 닫는 오버헤드를 줄여줍니다. 이는 비동기 방식으로 여러 요청을 처리할 때 특히 유용합니다.

강의에서 사용하는 코드에서는 엔진을 생성할 때 풀링에 대한 세부 설정이 없지만, QueuePool을 설정하면 데이터베이스 연결을 더 효율적으로 관리할 수 있습니다. 특히 많은 동시 연결을 처리해야 하는 환경에서는 풀 옵션을 지정해주는 것이 유리합니다.

사용하려는 데이터베이스와 애플리케이션의 요구사항에 따라 풀 크기나 재활용 주기를 조정할 수 있습니다. 기본 설정 대신 QueuePool의 구성을 통해 성능을 높일 수 있다는 점 참고하세요.
용도나 성능 요구 사항에 따라 풀링을 추가적으로 활용해 보실 수 있습니다. FastAPI와 비동기 데이터베이스 연결을 최적화하는 방법은 프로젝트의 특정 요구 사항에 맞게 조정될 수 있습니다.

추가로 관련된 공식 문서 내용을 확인하고 싶으시면, 아래 링크를 방문해 보세요:
Spring Boot Reference Documentation - Supported Connection Pools

moljin님의 프로필 이미지
moljin

작성한 질문수

질문하기