fix: 트랜잭션 오류 해결 및 CORS 오류 수정

- 리비전 업로드 시 InFailedSqlTransaction 오류 해결
- 트랜잭션 롤백 및 새 세션 생성 로직 추가
- 특정 쿼리 실행 전 트랜잭션 롤백 처리
- API URL을 /api로 통일하여 CORS 오류 해결
- J24-001 더미 프로젝트 옵션 완전 제거
This commit is contained in:
hyungi
2025-10-15 13:45:20 +09:00
parent 8f5330a008
commit 9725331af0
3 changed files with 38 additions and 14 deletions

View File

@@ -323,6 +323,24 @@ async def upload_file(
db: Session = Depends(get_db),
current_user: dict = Depends(get_current_user)
):
# 🎯 트랜잭션 오류 방지: 완전한 트랜잭션 초기화
try:
# 1. 현재 트랜잭션 완전 롤백
db.rollback()
print("🔄 1단계: 이전 트랜잭션 롤백 완료")
# 2. 세션 상태 초기화
db.close()
print("🔄 2단계: 세션 닫기 완료")
# 3. 새 세션 생성
from ..database import get_db
db = next(get_db())
print("🔄 3단계: 새 세션 생성 완료")
except Exception as e:
print(f"⚠️ 트랜잭션 초기화 중 오류: {e}")
# 오류 발생 시에도 계속 진행
# 로그 제거
if not validate_file_extension(file.filename):
raise HTTPException(
@@ -541,13 +559,24 @@ async def upload_file(
print(f"🔄 리비전 업로드: 전체 {len(materials_to_classify)}개 자재 저장 (변경사항 추적 포함)")
# 이전 리비전의 자재 조회 (도면번호 기준)
prev_materials_query = text("""
SELECT original_description, size_spec, material_grade, main_nom,
drawing_name, line_no, quantity
FROM materials
WHERE file_id = :parent_file_id
""")
prev_materials_result = db.execute(prev_materials_query, {"parent_file_id": parent_file_id}).fetchall()
try:
# 🎯 트랜잭션 오류 방지: 쿼리 실행 전 롤백
db.rollback()
print("🔄 리비전 자재 조회 전 트랜잭션 롤백")
prev_materials_query = text("""
SELECT original_description, size_spec, material_grade, main_nom,
drawing_name, line_no, quantity
FROM materials
WHERE file_id = :parent_file_id
""")
prev_materials_result = db.execute(prev_materials_query, {"parent_file_id": parent_file_id}).fetchall()
print(f"✅ 이전 리비전 자재 조회 성공: {len(prev_materials_result)}")
except Exception as e:
print(f"❌ 이전 리비전 자재 조회 실패: {e}")
# 오류 발생 시 빈 결과로 처리
prev_materials_result = []
# 이전 자재를 딕셔너리로 변환 (도면번호 + 설명 + 크기 + 재질로 키 생성)
prev_materials_dict = {}

View File

@@ -649,11 +649,7 @@ function App() {
</option>
))
) : (
<>
<option value="J24-001">J24-001 - 테스트 프로젝트 A</option>
<option value="J24-002">J24-002 - 테스트 프로젝트 B</option>
<option value="J24-003">J24-003 - 테스트 프로젝트 C</option>
</>
<option value="">프로젝트를 먼저 생성해주세요</option>
)}
</select>

View File

@@ -3,8 +3,7 @@ import { logApiError } from './utils/errorLogger';
// 환경변수에서 API URL을 읽음 (Vite 기준)
// 프로덕션에서는 nginx 프록시를 통해 /api 경로 사용
const API_BASE_URL = import.meta.env.VITE_API_URL ||
(import.meta.env.DEV ? 'http://localhost:18000' : '/api');
const API_BASE_URL = '/api';
console.log('API Base URL:', API_BASE_URL);
console.log('Environment:', import.meta.env.MODE);