""" 사용자 서비스 사용자 관리 관련 비즈니스 로직을 관리하는 서비스 레이어 """ from typing import Dict, Any, Optional from types import SimpleNamespace from models.user_model.users import Users from repositories import UserRepository from services.auth.cache_service import UserCacheService, JWTBlacklistService from utils.db_decorators import transactional from extensions import custom_logger import settings logger = custom_logger(f"{settings.LOG_PREFIX}_user_service") class UserService: """ 사용자 서비스 """ @staticmethod def get_user_by_uuid(user_uuid: str, use_cache: bool = True) -> Optional[Users]: """UUID로 사용자 조회 (캐시 우선)""" if use_cache: # 캐시 조회 cached_user_data = UserCacheService.get(user_uuid) if cached_user_data: user = SimpleNamespace(**cached_user_data) user.to_dict = lambda: cached_user_data logger.debug(f"캐시에서 사용자 조회 성공: {user_uuid}") return user # DB 조회 user_repo = UserRepository() user = user_repo.find_by_uuid(user_uuid) if user and use_cache: # 캐시 저장 UserCacheService.set(user_uuid, user.to_dict()) logger.debug(f"DB에서 사용자 조회 후 캐시에 저장: {user_uuid}") return user @staticmethod def get_user_by_id(user_ud: str) -> Optional[Users]: """ID로 사용자 조회""" user_repo = UserRepository() return user_repo.get_by_id(user_ud) @staticmethod @transactional def update_user_profile(user_uuid: str, update_data: Dict[str, Any]) -> Users: """사용자 프로필 업데이트""" user_repo = UserRepository() # 사용자 조회 user = user_repo.find_by_uuid(user_uuid) if not user: return None # 업데이트 가능한 필드만 처리 if "user_name" in update_data: user.user_name = update_data["user_name"] user = user_repo.update(user) # 캐시 갱신 UserCacheService.refresh(user_uuid, user.to_dict()) logger.info(f"사용자 프로필이 업데이트되었습니다: {user_uuid}") return user @staticmethod def invalidate_user_cache(user_uuid: str) -> bool: """사용자 캐시 무효화""" success = UserCacheService.delete(user_uuid) if success: logger.debug(f"사용자 캐시가 무효화되었습니다: {user_uuid}") return success @staticmethod @transactional def delete_user(user_uuid: str, jti: Optional[str] = None) -> bool: """사용자 삭제 (회원 탈퇴)""" user_repo = UserRepository() user = user_repo.find_by_uuid(user_uuid) if not user: logger.warning(f"삭제할 사용자를 DB에서 찾을 수 없음: {user_uuid}") UserCacheService.delete(user_uuid) return False # 삭제 success = user_repo.delete(user) if success: # 캐시 무효화 UserCacheService.delete(user_uuid) # JWT 블랙리스트 추가 (현재 토큰 무효화) if jti: JWTBlacklistService.add(jti) logger.debug(f"JWT 블랙리스트 추가: {jti}") logger.info(f"사용자가 삭제되었습니다: {user_uuid}") return success