From cb8485ecd5f07ce3558d760d904532f981177007 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=B1=EA=B2=BD?= Date: Mon, 27 Jul 2026 11:21:01 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EB=A1=A4=EB=B0=B1=20=EB=A1=9C=EA=B9=85=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=20=EB=B0=8F=20=EC=98=81=EC=83=81=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EB=B0=B0=EC=A0=95=20=EC=9D=BC?= =?UTF-8?q?=EA=B4=80=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - get_session에서 SocialException/DashboardException을 별도로 처리하여 정상 플로우인 도메인 예외는 ERROR traceback 없이 warning 롤백 로그만 남기도록 수정 - generate_video 호출 시 CreatomateService에 project_id를 전달하여, 미매핑 업종(general 등)의 템플릿 분배가 사전 이미지 배정 단계와 동일한 템플릿을 사용하도록 일관성 확보 --- app/database/session.py | 12 ++++++++++++ app/video/api/routers/v1/video.py | 3 +++ 2 files changed, 15 insertions(+) diff --git a/app/database/session.py b/app/database/session.py index 6b914b3..8988c91 100644 --- a/app/database/session.py +++ b/app/database/session.py @@ -6,6 +6,8 @@ from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.orm import DeclarativeBase +from app.dashboard.exceptions import DashboardException +from app.social.exceptions import SocialException from app.utils.logger import get_logger from config import db_settings @@ -137,6 +139,16 @@ async def get_session() -> AsyncGenerator[AsyncSession, None]: yield session except HTTPException: raise + except (SocialException, DashboardException) as e: + # 전역 exception handler가 응답으로 변환하는 도메인 예외. + # 정상 플로우이므로 ERROR traceback 없이 롤백만 수행. + await session.rollback() + logger.warning( + f"[get_session] ROLLBACK - handled domain error: " + f"{type(e).__name__}: {e}, " + f"duration: {(time.perf_counter() - start_time)*1000:.1f}ms" + ) + raise except Exception as e: await session.rollback() logger.error(traceback.format_exc()) diff --git a/app/video/api/routers/v1/video.py b/app/video/api/routers/v1/video.py index b59b36c..9cc465b 100644 --- a/app/video/api/routers/v1/video.py +++ b/app/video/api/routers/v1/video.py @@ -356,6 +356,9 @@ async def generate_video( creatomate_service = CreatomateService( orientation=orientation, industry=industry, + # 미매핑 업종(general 등)은 project_id % len(VST_LIST)로 템플릿을 분배하므로, + # 사전 이미지 배정 단계(creative_assets_task)와 동일 템플릿을 받으려면 필수 + project_id=project_id, ) logger.debug( f"[generate_video] Using template_id: {creatomate_service.template_id}, (song duration: {song_duration})"