백엔드/Python-Flask 작지만 기억할 만한 네 가지: Alembic 빈 마이그레이션, 시뮬레이션 엔드포인트, F841 ignore, 'done' vs 'success' 시리즈 마지막 편은 작지만 기억할 만한 네 가지 수정을 묶었습니다. 빈 Alembic revision이 생기는 이유, "시뮬레이션" 주석이 남긴 엔드포인트, F841 ignore 뒤의 숨은 버그, 프론트/백엔드 상태 문자열 불일치 — 모두 "임시는 영구화된다"는 공통 교훈을 가집니다.
백엔드/Python-Flask Rate Limiting을 걷어낸 날: 폐쇄망 배포에서 보안은 더하는 것이 아니다 "보안은 항상 더하는 것"이라는 통념의 반례. 폐쇄망 + nginx 프록시 배포에서 Flask-Limiter가 부과하던 의존성/운영 혼란/인지 부담을 가치-비용으로 저울질하고 제거한 의사결정 기록입니다. Next.js 구현 편의 자매 글입니다.
백엔드/Python-Flask 서버 기동을 거부시키는 설정 검증과 Path().name 한 줄로 막는 Path Traversal `ALLOWED_ORIGINS`를 까먹으면 CORS가 `*` 폴백으로 조용히 열려 있던 문제와 URL 파라미터에 `../`를 꽂으면 상위 디렉토리 접근이 가능했던 path traversal을 각각 한 줄로 수정한 이야기입니다.
백엔드/Python-Flask 하나의 백엔드로 Detection/Classification/Segmentation 지원하기: task별 데이터셋 포맷 분기 UI의 task 드롭다운은 있었지만 백엔드는 항상 detection만 돌리고 있었습니다. 5 사이즈 × 3 task = 15 variant를 task별 데이터셋 포맷(bbox/ImageFolder/polygon)과 메트릭 컬럼 분기로 통합한 기록입니다.
백엔드/Python-Flask 조용한 ML 버그: train과 val이 같은 폴더를 가리키면 mAP가 거짓말을 한다 YOLO 학습에서 mAP가 높게 찍히는데 실제 배포 시 정확도가 안 나온다면 `data.yaml`을 먼저 확인해 보세요. train과 val이 같은 폴더를 가리키는 "조용한 ML 버그"의 전말과 80/20 재현 가능 분할 수정기입니다.
백엔드/Python-Flask Python/SQLAlchemy N+1 쿼리 잡기: 이미지 라벨링 플랫폼 실전 편 코드 리뷰에서 발견된 세 곳의 N+1 쿼리. 이미지 100장이면 DB 라운드트립이 101회였던 이유와 `IN` 쿼리 + 벌크 DELETE로 2회로 줄인 실전 기록을 Python/SQLAlchemy로 정리했습니다. Prisma 편의 자매글입니다.
백엔드/Python-Flask Flask에서 ML 학습 백그라운드 실행: threading의 한계와 ProcessPoolExecutor 전환 Flask에서 YOLO 학습을 `threading.Thread`로 돌리면 GIL 병목, 취소 불가, orphan 기록 세 문제가 생깁니다. `ProcessPoolExecutor`로 전환하면서 PID 기반 SIGTERM 폴백과 서버 기동 시 복구 훅까지 함께 다룹니다.
백엔드/Python-Flask JSON 파일 데이터베이스에서 PostgreSQL로: 서비스 시그니처를 유지하며 데이터 레이어 교체하기 `users.json`, `labels/*.json` 파일 저장소를 PostgreSQL로 교체하면서 라우트 9개는 한 줄도 수정하지 않았습니다. 계층 경계를 미리 뽑아 둔 지난 편 리팩토링의 보상을 그대로 보여 주는 실전 기록입니다.
백엔드/Python-Flask 1,932줄 app.py를 54줄로: 모놀리식 Flask를 Blueprint로 분해하기 인수인계 받은 Flask 백엔드의 `app.py`가 1,932줄 한 파일에 42개 API가 섞여 있었습니다. Application Factory 패턴과 Blueprint로 도메인을 분리하고, 42개 경로를 그대로 유지하며 프론트엔드 변경 없이 리팩토링한 실전 기록입니다.