ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Day 15: 데이터베이스 설정 및 통합 – SQLite와 FastAPI
    21일오블완챌린지_vue.js와fastapi로 만드는 웹 주문 시스템 2024. 11. 21. 09:52

    이번 주는 데이터 통합이 주제입니다. 오늘은 SQLite를 사용하여 FastAPI 서버에 영구적인 데이터 저장소를 설정합니다. 이를 통해 서버를 재시작해도 주문 데이터가 유지되도록 구현합니다.


    1. SQLite와 SQLAlchemy 설치

    FastAPI와 함께 데이터베이스를 사용할 때, SQLAlchemy는 데이터베이스 작업을 관리하기 위한 훌륭한 도구입니다.

    설치 명령어

    bash
    코드 복사
    pip install sqlalchemy sqlite3

    2. 데이터베이스 설정

    FastAPI에서 SQLAlchemy를 설정하고 SQLite 데이터베이스를 연결합니다.

    디렉토리 구조 설정

    server 폴더 안에 database.py 파일을 생성합니다.

    css
    코드 복사
    server/ ├── main.py ├── database.py

    database.py 작성

    SQLite 데이터베이스를 연결하고, 주문 데이터를 저장하기 위한 테이블을 설정합니다.

    from sqlalchemy import create_engine, Column, Integer, String, Text
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker
    
    # SQLite 데이터베이스 URL
    DATABASE_URL = "sqlite:///./orders.db"
    
    # 데이터베이스 엔진 생성
    engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
    
    # 데이터베이스 세션 생성
    SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
    
    # 베이스 클래스 생성
    Base = declarative_base()
    
    # 주문 모델 정의
    class Order(Base):
        __tablename__ = "orders"
        id = Column(Integer, primary_key=True, index=True)
        name = Column(String, nullable=False)
        item = Column(String, nullable=False)
        quantity = Column(Integer, nullable=False)
        notes = Column(Text, nullable=True)
        status = Column(String, default="대기 중")

    데이터베이스 테이블 생성

    데이터베이스 테이블을 생성하기 위해 main.py에 다음 코드를 추가합니다.

    from database import Base, engine # 데이터베이스 테이블 생성 Base.metadata.create_all(bind=engine)

    3. FastAPI에서 데이터베이스 통합

    FastAPI 엔드포인트에서 SQLAlchemy를 사용해 데이터를 데이터베이스에 저장하고 조회하도록 변경합니다.

    main.py 수정

    SessionLocal을 사용해 데이터베이스 세션을 관리하고 주문 데이터를 저장합니다.

    from fastapi import FastAPI, Depends, HTTPException
    from sqlalchemy.orm import Session
    from database import SessionLocal, Order
    
    app = FastAPI()
    
    # 데이터베이스 세션 종속성 설정
    def get_db():
        db = SessionLocal()
        try:
            yield db
        finally:
            db.close()
    
    @app.post("/order")
    def create_order(order: Order, db: Session = Depends(get_db)):
        db_order = Order(
            name=order.name,
            item=order.item,
            quantity=order.quantity,
            notes=order.notes,
        )
        db.add(db_order)
        db.commit()
        db.refresh(db_order)
        return {"message": "Order created successfully", "order": db_order}
    
    @app.get("/orders")
    def get_orders(db: Session = Depends(get_db)):
        orders = db.query(Order).all()
        return {"orders": orders}

    4. 테스트

    FastAPI 서버 실행

    bash
    코드 복사
    uvicorn main:app --reload

    테스트 시나리오

    1. /order 엔드포인트로 POST 요청을 보내 데이터를 저장.
    2. /orders 엔드포인트로 GET 요청을 보내 저장된 데이터를 확인.
    3. 서버를 재시작한 후에도 데이터가 유지되는지 확인.

    5. 클라이언트와 데이터베이스 연동 확인

    Vue 클라이언트에서 주문을 생성하고, 서버에서 주문 데이터를 저장하고 조회하는 흐름이 정상적으로 작동하는지 확인합니다.


    오늘의 마무리

    오늘은 FastAPI와 SQLite를 통합하여 주문 데이터를 영구적으로 저장하는 기능을 구현했습니다. 데이터베이스 설정을 통해 앱이 실질적인 사용자 데이터를 처리할 수 있는 기반이 마련되었습니다.

    내일은 주문 상태를 데이터베이스에서 업데이트하고, 이를 클라이언트에서 확인하는 작업을 진행하겠습니다. 🚀

Designed by Tistory.