# 검증 보고서 — B01 프로젝트 삭제: 개발용 하드 삭제 스위치 - **검증 날짜**: 2026-08-08 - **검증 대상**: 개발 환경용 프로젝트 데이터베이스 행 및 물리 디스크 통삭제 스위치 기능 - **검증자**: Antigravity (코드 검증자 역할) ## 1. 검증 내용 - **설정 및 스위치 위치**: - `config/config_system.py` 최상단에 `PROJECT_DELETE_HARD_ENABLED` 플래그를 두어 시인성을 극대화함. 기본값이 `False`여서 환경변수가 없는 운영 배포 환경에서는 안전하게 소프트 삭제로 작동함. - **물리 경로 해석 검증 (`resolve_project_root_for_delete`)**: - `resolve_stored_project_path()`와 달리 삭제용 경로는 `os.makedirs`를 호출하지 않아 불필요한 폴더 복원을 차단함. - 경로 검증 시 절대경로 여부, `..`을 통한 상위 경로 이탈 차단, 세그먼트 수 검증(정확히 4개), 첫 세그먼트가 `storage`인지 검증, 마지막 세그먼트가 `project_id` 문자열과 일치하는지 엄밀히 검증함. - 이로 인해 타 프로젝트 폴더나 시스템 루트 폴더가 오삭제되는 사고를 철저히 예방함. - **삭제 비즈니스 로직 및 실행 순서 (`hard_delete_project`)**: - **DB 삭제 먼저, 파일 삭제 나중** 원칙을 엄수함. - `SELECT storage_path`로 경로를 우선 확보한 뒤 검증을 통과하지 못하면 DB를 롤백함. - DB 트랜잭션 안에서 `DELETE FROM projects`를 실행하여 CASCADE 설정된 10여 개 자식 테이블이 정상 삭제되도록 함. - `PROJECT_HARD_DELETE` 감사 로그를 남긴 후 `commit()`이 완료된 상태에서 `shutil.rmtree`를 수행함. - 만약 디스크 삭제(`shutil.rmtree`) 중 오류(권한, 파일 잠금 등)가 발생해도, DB는 이미 정리된 정합한 상태이므로 시스템 오작동이 없도록 설계됨. rmtree 오류는 에러 로그로 남겨 수동 정리 가능하게 함. - **라우터 분기 및 UI 경고창 다국어**: - `B01_Dashboard_Router.py`에서 플래그에 따라 `hard_delete_project`와 `soft_delete_project`를 올바르게 선택하여 실행함. - `/api/dashboard/me` 응답에 `project_delete_hard` 플래그를 내려보내 프론트엔드가 이를 인식함. - `B01_Dashboard_UI_Modals.ts`에서 하드 삭제 모드일 경우 원본 데이터가 날아간다는 고유 경고 창(`B01_Dashboard_Confirm_DeleteProject_Hard`)을 노출하여 사용자 실수를 사전에 경고함. ## 2. 검증 결과 - 기획 및 사용자 요구사항에 정의된 안전 조치가 백엔드와 프론트엔드 양측에 정밀하게 구현되었음이 검증됨. - 특히 경로 가드 로직이 견고하여 오작동 위험을 원천 차단함. ## 3. 미결 리스크 권고 사항 (운영 주의) - 현재 저장소 내 `.env` 파일이 Git으로 계속 추적되고 있음. 로컬 개발 시 임시로 `.env`에 `PROJECT_DELETE_HARD_ENABLED=True`를 기재한 채 실수로 Git Push를 하게 되면, 운영 서버 배포 시 스위치가 강제로 켜지는 불상사가 발생할 수 있음. - **조치 방안**: 운영 배포 브랜치나 CI/CD 파이프라인에서 `.env` 환경 변수가 명시적으로 `False`가 되도록 안전장치를 하거나, 배포 전에 `.env`를 Git 추적에서 정식으로 분리(`git rm --cached .env` 및 `.gitignore` 설정 수정)할 것을 강력히 권고함.