Files
nuriq_back/src/repositories/base_repository.py
윤영훈 abf405f8ae [FEAT] (사용자 로직): 프로필 서비스 구현 완료
v0.1.3 (2025-11-16)
- 프로필 조회, 프로필 업데이트, 탈퇴 구현 완료.
2025-11-16 18:02:27 +09:00

72 lines
2.1 KiB
Python

"""
기본 레파지토리 추상 클래스
"""
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