""" 기본 레파지토리 추상 클래스 """ from abc import ABC, abstractmethod from typing import TypeVar, Generic, Optional, List, Type from sqlalchemy.exc import SQLAlchemyError from extensions import db, custom_logger import settings # Generic type for model entitles T = TypeVar("T") logger = custom_logger(f"{settings.LOG_PREFIX}_repository") class BaseRepository(ABC, Generic[T]): """ 기본직인 CRUD 제공 """ @property @abstractmethod def model(self) -> Type[T]: """레파지토리 반환""" pass @property def session(self): """현재 DB 세션 가져오기""" return db.session def create(self, entity: T) -> T: """엔티티 생성""" try: self.session.add(entity) self.session.flush() logger.debug(f"{self.model.__name__} 생성완료: {getattr(entity, 'id', 'unknown')}") return entity except SQLAlchemyError as e: logger.error(f"{self.model.__name__} 생성 실패: {str(e)}") raise def update(self, entity) -> T: """엔티티 수정""" try: self.session.add(entity) self.session.flush() logger.debug(f"{self.model.__name__} 수정완료: {getattr(entity, 'id', 'unknown')}") return entity except SQLAlchemyError as e: logger.error(f"{self.model.__name__} 수정 실패: {str(e)}") raise def delete(self, entity: T) -> bool: """엔티티 삭제""" try: self.session.delete(entity) self.session.flush() logger.debug(f"{self.model.__name__} 삭제완료: {getattr(entity, 'id', 'unknown')}") return True except SQLAlchemyError as e: logger.error(f"{self.model.__name__} 삭제 실패: {str(e)}") raise def count(self) -> int: """엔티티 개수 반환""" try: return self.session.query(self.model).count() except SQLAlchemyError as e: logger.error(f"{self.model.__name__} 개수 조회 실패: {str(e)}") raise