**task-2221 완료 보고** (dev1-team) **task-2221 완료 보고서** (12분 47초) **핵심 결과** 서버에 `DELETE /api/insuro/delete-with-drive/{table}/{record_id}` 엔드포인트를 추가하여, file_url에서 Drive file_id를 추출 → Drive 삭제 → DB 삭제를 순차 수행하도록 구현. Drive 삭제 실패 시에도 DB 삭제는 진행하여 기존 데이터보다 나쁜 상태가 되지 않도록 설계. 프론트엔드 2개 페이지의 handleDelete를 새 API 호출로 변경. Python compile OK, 프론트엔드 빌드 13.15s 성공, AST 검증 PASS. ## 수정 파일 | 파일 | 변경 내용 | grep 검증 | 상태 | |------|-----------|-----------|------| | server/gdrive.py:205 | delete_drive_file 함수 추가 | grep "delete_drive_file" OK (1건) | verified | | server/main.py:3848 | DELETE /api/insuro/delete-with-drive 엔드포인트 추가 | grep "delete-with-drive" OK (1건) | verified | | src/pages/AdminNewsletters.tsx:169 | handleDelete → fetch delete-with-drive API | grep "delete-with-drive" OK (1건) | verified | | src/pages/AdminPremiumData.tsx:182 | handleDelete → fetch delete-with-drive API | gre **발견/해결 이슈 3건** 1. **SQL injection 위험** — table 파라미터를 화이트리스트(`newsletters`, `premium_data`)로 검증하여 임의 테이블 접근 차단 2. **Drive 삭제 실패 시 DB 삭제 미실행 위험** — try/except로 Drive 삭제 실패를 허용하되 warning 로그 출력, DB 삭제는 독립 실행 3. **file_url이 없는 이전 데이터 처리** — file_url 빈 문자열/None 시 Drive 삭제 스킵, DB 삭제만 수행