상세 컨텐츠

본문 제목

[FastAPI] CRUD 구현 (database.py부분 중점) #2

FastAPI

by grizzly 2025. 4. 9. 14:55

본문

이제 이어서 database.pyschemas.py에 대해서 알아보자

앞서서 본 코드는 다음과 같았다.

router = APIRouter(
    prefix="/patients",
    tags=["patients"],
    responses={404: {"description": "Not found"}}
)


@router.post("/", response_model=schemas.Patient)
def create_patient(patient: schemas.PatientCreate, db: Session = Depends(get_db)):
    db_patient = models.Patient(**patient.dict())
    db.add(db_patient)
    db.commit()
    db.refresh(db_patient)
    return db_patient

 

이제 여기에 의존성으로 주입된 db 부분과 데이터 형식을 정하기 위한 schema 부분을 알아보자

 

일단 database.py부터 알아보면,

# database.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# SQLite 데이터베이스 사용 (실제 환경에서는 PostgreSQL 등 사용 권장)
SQLALCHEMY_DATABASE_URL = "sqlite:///./healthcare.db"

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

# DB 세션 의존성
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionamker
  1. create_engine
    1. 데이터베이스 엔진을 생성하는 함수
  2. declarative_base
    1. ORM 모델을 정의하기 위한 베이스 클래스를 생성하는 함수
    2. 모든 모델 클래스가 이 베이스를 상속
  3. sessionmaker
    1. 데이터베이스 세션 팩토리 생성 함수
    2. 데이터베이스 작업을 수행하는 인터페이스 역할

 

데이터베이스 URL 설정

SQLALCHEMY_DATABASE_URL = "sqlite:///./healthcare.db"
  1. 데이터베이스 연결 문자열을 정의
  2. sqlite:///./healthcare.db: 현재 디렉토리에 healthcare.db 파일을 생성하여 SQLite 데이터베이스로 사용

데이터베이스 엔진 생성

engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
  1. create_engine : 지정된 URL로 데이터베이스 엔진을 생성
  2. connect_args={"check_same_thread": False}
    1. SQLite 전용 옵션
    2. 다른 스레드에서도 데이터베이스 연결을 사용할 수 있게 함
      1. FastAPI = 비동기 프레임워크이므로 여러 요청에서 동일한 연결을 사용할 수 있어야 함

세션 팩토리 생성

 

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  1. sessionmaker : 데이터베이스 세션을 생성하는 팩토리 클래스
  2. autocommit=False
    1. 자동 커밋을 비활성화
    2. 트랜잭션을 명시적으로 커밋해야 함
  3. autoflush=False
    1. 자동 플러시를 비활성화
    2. 쿼리 실행 전에 변경 사항을 자동으로 데이터베이스에 플러시하지 않음
  4. bind=engine
    1. 세션이 사용할 데이터베이스 엔진을 지정

베이스 클래스 생성

Base = declarative_base()
  1. 모든 ORM 클래스가 상속받을 기본 클래스 생성
  2. models.py 에서 모든 클래스가 이 Base를 상속받음
  3. 모델 클래스와 데이터테이블 간의 매핑을 설정하는 메타데이터를 관리

데이터베이스 세션 의존성 함수

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
  1. db=SessionLocal()
    1. 새 데이터베이스 세션을 생성
  2. yield db
    1. 세션을 의존성으로 제공
      1. yield 사용시 해당 함수는 제너레이터가 되어 FastAPI에서 의존성으로 사용 가능
      2. 라우터 함수가 실행된 후에도 제어가 이 함수로 돌아옴
  3. filnally: db.close()
    1. 요청 처리가 완료된 후 항상 세션을 닫음
    2. 리소스 누수를 방지하고 연결 풀 관리

다음 포스팅에 이어서 schemas.py에 대해서 알아보자

 

 

관련글 더보기