FastAPI(planner 코드리뷰 src.database.connection)

2025. 5. 2. 20:46고급 웹프로그래밍

코드 리뷰

from motor.motor_asyncio import AsyncIOMotorClient
from beanie import init_beanie, Document
from src.models.events import Event,Eventupdate
from src.models.users import User
from src.config import settings


async def initialize_database(): # 데이터베이스 초기화
    try:
        client = AsyncIMotorClient(settings.DATABASE_URL) # 데이터베이스를 비동기적으로 사용
        await init_beanie(
        database= client.get_default_database(), # URL을 기반으로 데이터베이스 객체를 가져옴
        documetn_models=[Event, User], # Event와 User라는 두 클래스를 컬렉션으로 등록 ( 이렇게 등록해야 Beanie로 await User.find_one(...)같은걸 사용할 수 있다

        )
        print("Database initialized successfully")
    except Exception as e:
        print(f"Error initializing database: {e}")

class Database:
    def __init__(self,model : Document) -> None:  # 클래스가 생성될 때 자동으로 model이라는 인자를 받고 저장하겠다
        self.model = model # 받은 model 인자를 저장

    async def save(self, document: Document):
        await document.create() # DB에 저장, 이 작업이 다 끝나기 전에 다른일을 하지 않도록 await
        return # None 반환

   async def get_all(self) -> list:
       docs = await self.model.find_all().to_list() #  model의 모든 문서를 가져오고 리스트로 docs에 저장
       return docs

   async def delete(self, id:int):
       doc = self.get(id)
       await doc.delete()

   async def get(self, id: int):
      doc = await self.model.get(id)
      return doc

  async def update(self, id: int,body: EventUpdate):
      doc = await self.model.get(id) # id에 해당하는 문서를 가져온다
      body=body.model_dump() # EventUpdate 에서 정의한 객체를 딕셔너리 형태로 변환
      body = {"$set": {k: v for k, v in body.items() if v is not None}} # 값이 비워져 있는 필드는 제외하고 수정
      await doc.update(body) # 수정한 값을 데이터베이스에 업데이트

용어 의미

  • AsyncIOMotorClient: MongoDB와 비동기로 통신할 수 있게 해주는 드라이버인 Motor에서, 실제로 데이터베이스에 연결할 때 사용하는 핵심 클래스
    • async def 함수 안에서 await를 사용해 MongoDB에 쿼리 요청을 보낼 수 있게 해줌
  • init_beabie: Beanie ODM에서 MongoDB와 연결하고, 사용할 Document 모델들을 등록할 때 사용하는 초기화 함수
    • MongoDB 연결 설정 + 어떤 모델을 사용할지 지정하는 작업 담당
  • get-default_database(): MongoDB URL에서 지정된 기본 데이터베이스 이름에 해당하는 데이터베이스 객체를 가져온다
  • find_all()은 해당 컬렉션의 모든 문서를 찾는 쿼리
    • SQL로 치면: SELECT * FROM events
  • to_list(): 결과를 리스트(list)로 바꿔주는 함수
  • body.model_dump(): Pydantic 모델을 일반 딕셔너리로 변환하는 함수
  • "$set" : 특정 필드 수정
반응형