선별 시스템 백엔드 Flask → Django 포팅
Flask Blueprint를 Django + DRF로 옮기고 DB를 분리한 4단계 포팅 작업
배경
Flask Blueprint 기반 단순 라우팅 구조였던 선별 시스템 백엔드가 팀 확장과 함께 한계를 드러냈다. 개발자 간 코드 충돌, 역할 분리 어려움, 관리 페이지 직접 개발 부담, AI 모델이 바뀔 때마다 MySQL 스키마를 고쳐야 하는 구조적 비용이 쌓였다. 같은 시기 코드 리뷰에서 GitHub 토큰 하드코딩, JWT 수명 100년, SQL 인젝션이 발견되어 보안도 같이 손봐야 했다.
시스템 구조
- Phase 1 → 2: Flask 내부 MVC 리팩토링 + MySQL/MongoDB 이중 구조로 데이터 특성별 분리.
- Phase 3: Django + PostgreSQL 무중단 전환, Django Admin으로 관리 페이지 별도 개발 제거.
- Phase 4: Selector / Service / API 3계층 분리 + 연결 풀링·Redis 캐싱·인덱스·파티션을 일원화한 DB 전략 프레임워크 + 보안 수정.
해결 과정
Phase 1 — Flask MVC 리팩토링. Blueprint로 흩어져 있던 라우트·로직·쿼리를 MVC로 정리하고, 팀 내 MVC 학습 세션과 가이드 문서를 함께 올려 컨벤션을 맞췄다.
Phase 2 — MySQL/MongoDB 이중 구조 정형 데이터는 MySQL에 두고, AI 추론 결과와 이미지 메타 같은 비정형 데이터는 MongoDB로 뺐다. AI 모델이 바뀌어도 MySQL 스키마를 따라 고치지 않아도 된다.
Phase 3 — Django 마이그레이션 Flask에서 Django로 옮기면서 MySQL도 PostgreSQL로 전환했다. Django Admin으로 관리 페이지를 별도 구현하지 않아도 됐고, 엔드포인트 단위 점진 전환으로 서비스 중단 없이 끝냈다.
Phase 4 — 보안·아키텍처 정리 하드코딩된 시크릿을 환경 변수로 옮기고, JWT 수명을 100년에서 7일로 줄였다. SQL 인젝션은 Django ORM 파라미터 바인딩으로 정리했다. 앱 구조는 Selector / Service / API 3계층으로 표준화하고, 연결 풀링·Redis 캐싱·복합 인덱스·파티션 관리를 DB 전략 프레임워크 하나로 묶었다.
성과
- Flask → Django 무중단 전환, MySQL → PostgreSQL + MongoDB 분리.
- JWT 수명 100년 → 7일, SQL 인젝션 제거, 하드코딩된 시크릿 환경 변수로 이전.
- RANGE 파티셔닝과 복합 인덱스로 대시보드 로딩 85% 단축, 그래프 API 응답 90% 개선.
- Selector / Service / API 3계층 표준, API 문서 자동화, Django Admin 기반 내부 관리로 팀 운영 부담 감소.