#87, #89 병합
[1] AUTO_SNAP_PREFIX 상수 분산 — main.py와 vmcontrol.py 불일치 위험
파일: main.py L141, api/routes/vmcontrol.py L504
AUTO_SNAP_PREFIX = "auto-daily" 상수가 main.py에만 정의되어 있고, vmcontrol.py에서는 "auto-daily" 문자열 리터럴을 직접 사용 중. 두 값이 달라지면 자동/수동 스냅샷 구분 로직(startswith 체크)이 깨짐.
수정 방향: 상수를 공통 모듈(예: core/config.py)로 이동하고 두 파일에서 import하여 단일 출처로 관리.
[2] expunge_all 이후 Server 관계 lazy-load 위험
파일: main.py L181–182, L213–215
joinedload(Vm.server)로 eager load 후 db.expunge_all()로 세션 분리. 이후 get_proxmox_for_server(server) 및 server.name 접근이 이루어짐. Server 모델에 추가 관계가 lazy-load로 설정되어 있다면 DetachedInstanceError가 발생할 수 있음.
수정 방향: get_proxmox_for_server가 접근하는 Server 모델의 모든 필드·관계를 확인 후 필요 시 joinedload 범위 확장하거나 필요한 값을 튜플로 미리 추출.
[3] 중복 스냅샷 이름 검증 없음 — 500 대신 400 반환 필요
파일: api/routes/vmcontrol.py L501–508
동일한 snap_name이 이미 존재하는 경우를 명시적으로 체크하지 않음. Proxmox가 중복 이름 오류를 반환하지만 except Exception이 이를 500으로 처리해 클라이언트가 의미 있는 오류 메시지를 받지 못함.
수정 방향: snapshot.get() 결과에서 동일 이름 존재 여부 확인 후 HTTPException(status_code=400, detail="이미 존재하는 스냅샷 이름입니다.") 처리.
[4] 에러 케이스 통합 테스트 미비
파일: tests/test_input_validation.py
Pydantic 스키마 단위 테스트는 있으나, 엔드포인트 레벨 에러 케이스가 없음.
- 미소유 VM 접근 시 403
- 존재하지 않는 VM 404
- 최대 스냅샷 개수 초과 400
수정 방향: TestClient 통합 테스트 추가. 소유권 검증과 Proxmox 응답 mock 처리 케이스 우선 작성.
#87, #89 병합
[1] AUTO_SNAP_PREFIX 상수 분산 — main.py와 vmcontrol.py 불일치 위험
파일:
main.pyL141,api/routes/vmcontrol.pyL504AUTO_SNAP_PREFIX = "auto-daily"상수가main.py에만 정의되어 있고,vmcontrol.py에서는"auto-daily"문자열 리터럴을 직접 사용 중. 두 값이 달라지면 자동/수동 스냅샷 구분 로직(startswith 체크)이 깨짐.수정 방향: 상수를 공통 모듈(예:
core/config.py)로 이동하고 두 파일에서 import하여 단일 출처로 관리.[2] expunge_all 이후 Server 관계 lazy-load 위험
파일:
main.pyL181–182, L213–215joinedload(Vm.server)로 eager load 후db.expunge_all()로 세션 분리. 이후get_proxmox_for_server(server)및server.name접근이 이루어짐.Server모델에 추가 관계가 lazy-load로 설정되어 있다면DetachedInstanceError가 발생할 수 있음.수정 방향:
get_proxmox_for_server가 접근하는Server모델의 모든 필드·관계를 확인 후 필요 시joinedload범위 확장하거나 필요한 값을 튜플로 미리 추출.[3] 중복 스냅샷 이름 검증 없음 — 500 대신 400 반환 필요
파일:
api/routes/vmcontrol.pyL501–508동일한
snap_name이 이미 존재하는 경우를 명시적으로 체크하지 않음. Proxmox가 중복 이름 오류를 반환하지만except Exception이 이를 500으로 처리해 클라이언트가 의미 있는 오류 메시지를 받지 못함.수정 방향:
snapshot.get()결과에서 동일 이름 존재 여부 확인 후HTTPException(status_code=400, detail="이미 존재하는 스냅샷 이름입니다.")처리.[4] 에러 케이스 통합 테스트 미비
파일:
tests/test_input_validation.pyPydantic 스키마 단위 테스트는 있으나, 엔드포인트 레벨 에러 케이스가 없음.
수정 방향:
TestClient통합 테스트 추가. 소유권 검증과 Proxmox 응답 mock 처리 케이스 우선 작성.