FastAPI vs Flask
전체 MVP 구현 기준 비교
현재 페이지는 두 층을 분리해 보여줍니다. Dashboard 집계·위험 이벤트 검색·정비 조치 추천 등 대표 기능 3개를 FastAPI와 Flask에 실제로 동일 구현해 기능·검증·성능을 대칭 비교했고, 전체 162개 OpenAPI 경로·172개 HTTP 작업은 FastAPI 제품 구현 현황과 Flask route mirror 범위를 구분해 표시합니다.
대표 기능 3개는 같은 GS fixture, 같은 risk snapshot, 같은 업무 함수를 양쪽에 연결한 실제 대칭 비교입니다. 반면 전체 172개 작업은 FastAPI에만 제품 업무 로직이 있고 Flask에는 route mirror만 있으므로, 전체 성능을 양쪽이 모두 구현한 것처럼 표현하지 않습니다.
1. 서로 다른 대표 기능 3개 실제 양방향 구현
/app/projects/manufacturing-demo-project의 주요 사용 패턴을 반영해 ① 집계·중첩 JSON, ② 필터·정렬·페이지네이션, ③ POST body 검증·업무 판단이라는 서로 다른 성격의 기능을 비교했습니다.
제조 Dashboard 집계
/benchmark/manufacturing-dashboard?risk_threshold=0.0&limit=8Aggregate eight risk events, line summaries and sensor series
위험 이벤트 검색·필터
/benchmark/risk-events?risk_threshold=0.6&status=warning&sort=probability_desc&limit=5&offset=0Filter, sort and paginate product risk events
정비 조치 추천
/benchmark/maintenance-recommendationValidate a POST body and apply a deterministic maintenance rule
| 대표 기능 | 프레임워크 | 순차 p50 | 순차 p95 | 순차 RPS | 동시 p50 | 동시 p95 | 동시 p99 | 동시 RPS | 오류율 | 기능 점수 |
|---|---|---|---|---|---|---|---|---|---|---|
| 제조 Dashboard 집계 | FastAPI | 3.4082ms | 3.823ms | 274.56 | 7.8964ms | 17.8237ms | 20.7399ms | 1001.27 | 0.0% | 4.92/5 |
| 제조 Dashboard 집계 | Flask | 3.3705ms | 3.6115ms | 276.05 | 8.0787ms | 18.2752ms | 23.4696ms | 979.18 | 0.0% | 4.94/5 |
| 위험 이벤트 검색·필터 | FastAPI | 3.3308ms | 3.6527ms | 278.96 | 7.9047ms | 17.3627ms | 18.7136ms | 999.0 | 0.0% | 4.9/5 |
| 위험 이벤트 검색·필터 | Flask | 3.2242ms | 3.5578ms | 287.49 | 7.4828ms | 17.9439ms | 20.3548ms | 1026.44 | 0.0% | 4.96/5 |
| 정비 조치 추천 | FastAPI | 3.3172ms | 3.6473ms | 279.21 | 7.8068ms | 17.616ms | 20.3067ms | 1010.78 | 0.0% | 4.9/5 |
| 정비 조치 추천 | Flask | 3.2191ms | 3.4648ms | 286.91 | 8.2141ms | 19.0106ms | 21.69ms | 973.31 | 0.0% | 4.86/5 |
각 기능마다 서버를 별도 프로세스로 실행하고 순차 300회 × 3라운드, 동시성 10도 같은 횟수로 요청했습니다. 기능과 라운드마다 FastAPI 우선·Flask 우선 순서를 교차했고, 두 서버 모두 매 요청 새 연결을 사용했습니다. 환경: macOS-27.0-arm64-arm-64bit-Mach-O · Python 3.14.6.
| 대표 기능 | 프레임워크 | Adapter 코드량 | 검증·계약 구현 |
|---|---|---|---|
| 제조 Dashboard 집계 | FastAPI | 15 LOC | 선언형 query/body 검증·response_model·OpenAPI |
| 제조 Dashboard 집계 | Flask | 33 LOC | 수동 query parser·Pydantic 호출·오류 응답 |
| 위험 이벤트 검색·필터 | FastAPI | 23 LOC | 선언형 query/body 검증·response_model·OpenAPI |
| 위험 이벤트 검색·필터 | Flask | 56 LOC | 수동 query parser·Pydantic 호출·오류 응답 |
| 정비 조치 추천 | FastAPI | 12 LOC | 선언형 query/body 검증·response_model·OpenAPI |
| 정비 조치 추천 | Flask | 13 LOC | 수동 query parser·Pydantic 호출·오류 응답 |
오류·경계값 계약 검증
| 기능 | 검증 사례 | 기대 HTTP | FastAPI | Flask | 결과 |
|---|---|---|---|---|---|
| manufacturing_dashboard | limit below minimum | 422 | 422 | 422 | 일치 |
| risk_event_search | unsupported sort value | 422 | 422 | 422 | 일치 |
| risk_event_search | valid empty result | 200 | 200 | 200 | 일치 |
| maintenance_recommendation | invalid operator role | 422 | 422 | 422 | 일치 |
| maintenance_recommendation | unknown event | 404 | 404 | 404 | 일치 |
입력 범위 초과, 지원하지 않는 정렬값, 정상적인 빈 검색 결과, 잘못된 POST enum, 존재하지 않는 이벤트 등 5개 사례를 확인했습니다. 상태 계약은 모두 일치했습니다. 기능별 네 성능 지표를 같은 비중으로 계산한 후 세 기능을 다시 평균한 결과는 FastAPI 4.91/5, Flask 4.92/5입니다. 운영 환경 벤치마크가 아니라 로컬 framework·server stack 비교이며 원격 DB와 외부 모델 호출은 제외했습니다.
2. 프레임워크별 실제 테스트 결과와 장단점
대표 기능 3개는 양쪽 모두 실제 구현했습니다. 전체 제품 수준에서는 FastAPI 172개 업무 작업과 Flask 3개 대표 업무 API + 172개 route mirror를 구분해 평가합니다.
FastAPI
실제 테스트 결과
- 실제 업무 핸들러 172개 실행
- OpenAPI 172개 자동 생성
- 요청 검증 대상 147개
- JSON 응답 런타임 검증 168개
- 인증 전수 프로브 처리되지 않은 5xx 0건
- 대표 기능 3개 성능 평균 4.91/5
장점
- typed router·의존성 주입·Pydantic을 이용해 큰 API 구조를 일관되게 구성할 수 있습니다.
- 코드·검증·Swagger 문서가 하나의 계약을 공유합니다.
- 잘못된 입력과 응답 계약 불일치를 런타임에서 탐지합니다.
단점
- 대표 기능별로 프레임워크 우위가 달라 환경에 따른 성능 변동을 고려해야 합니다.
- Pydantic 모델과 타입 계약을 지속적으로 관리해야 합니다.
Flask
실제 테스트 결과
- 라우트 미러 172개 등록 성공
- 대표 업무 API 3개 실제 구현
- 기본 구성 자동 OpenAPI·요청 검증·응답 Schema 0개
- 대표 기능 3개 성능 평균 4.92/5
장점
- 세 기능의 3라운드 성능 평균으로 단일 endpoint보다 신중하게 비교했습니다.
- 필요한 기능만 선택해 붙이는 유연성이 있습니다.
단점
- 큰 API에서는 프로젝트 구조와 확장 도구 조합을 별도로 설계해야 합니다.
- OpenAPI·Schema·요청 및 응답 검증은 기본 제공되지 않아 별도 구성이 필요합니다.
- 대표 API 외 전체 업무 애플리케이션은 구현하지 않아 172개 전체의 성능은 직접 비교하지 못했습니다.
3. 어떤 요소에 더 큰 비중을 뒀는가
| 평가 요소 | 가중치 | 실제 테스트 결과 | FastAPI 평가 | Flask 평가 |
|---|---|---|---|---|
| 개발 완성도와 구현 생산성 | 25% | 서로 다른 대표 기능 3개(제조 Dashboard 집계, 위험 이벤트 검색·필터, 정비 조치 추천)의 HTTP adapter를 실제 구현한 결과 FastAPI는 50 LOC, Flask는 수동 query·body 검증을 포함해 80 LOC였습니다. FastAPI 전체 제품은 별도로 172개 업무 작업을 실행합니다. | 5/525점 반영 세 기능에서 query·body 제약과 응답 계약을 route 선언에 함께 표현해 adapter 코드가 더 짧았습니다. | 3/515점 반영 route 자체는 단순하지만 동일한 query·POST 검증과 오류 계약을 맞추기 위한 수동 코드가 추가됐습니다. |
| API 계약과 문서 자동화 | 25% | FastAPI는 OpenAPI 172개, JSON 성공 응답 Schema 168개, binary·SSE 계약 2개, no-content 계약 2개를 생성했습니다. bare Flask 자동 생성 결과는 0개입니다. | 5/525점 반영 라우터 코드와 Swagger 문서가 같은 계약을 사용해 변경 누락 위험이 작습니다. | 2/510점 반영 확장 라이브러리를 사용하면 구현할 수 있지만 bare Flask 기본 구성에는 포함되지 않습니다. |
| 요청·응답 검증과 오류 안전성 | 25% | 대표 기능 3개의 정상 응답 JSON과 SHA-256이 모두 일치했고, 입력·빈 결과·존재하지 않는 이벤트를 포함한 5개 검증 사례에서 HTTP 상태도 일치했습니다. FastAPI는 Query·Pydantic body constraint와 response_model로 자동 검증했고 Flask는 같은 결과를 수동 parser와 Pydantic 호출로 구현했습니다. 전체 FastAPI에서는 요청 검증 147개, JSON 응답 검증 168개, 미처리 5xx 0건을 확인했습니다. | 5/525점 반영 잘못된 입력과 구현·응답 계약 불일치를 실행 중에 바로 탐지합니다. | 4/520점 반영 세 대표 기능의 오류 상태는 동일했지만 query·body·응답 검증을 route마다 수동 연결해야 합니다. |
| 대표 업무 API 성능과 경량성 | 25% | 대표 기능 3개를 각각 별도 HTTP 프로세스에서 순차·동시성 10으로 3라운드 교차 측정했습니다. 기능별 점수는 제조 Dashboard 집계 FastAPI 4.92/5, Flask 4.94/5 · 위험 이벤트 검색·필터 FastAPI 4.9/5, Flask 4.96/5 · 정비 조치 추천 FastAPI 4.9/5, Flask 4.86/5이며, 세 기능 평균은 FastAPI 4.91/5, Flask 4.92/5입니다. 모든 정상 부하의 오류율은 0%였습니다. | 4.91/524.55점 반영 세 기능의 순차 p95·처리량과 동시성 p95·처리량을 같은 비중으로 계산한 평균을 반영했습니다. | 4.92/524.6점 반영 세 기능별 동일 지표를 측정하고 기능 평균을 계산해 단일 API 우연성의 영향을 줄였습니다. |
4. FastAPI 전체 제품 구현 현황과 Flask 구성 범위
아래 표는 전체 제품 성능의 대칭 비교가 아닙니다. FastAPI의 실제 제품 구현 범위와 Flask에서 같은 URL 구조가 등록되는지, 추가로 어떤 기능을 구성해야 하는지 보여주는 범위 분석입니다.
| 프레임워크 | API 표면 | 업무 핸들러 | 자동 OpenAPI | 요청 자동 검증 | 성공 응답 계약 | 응답 런타임 검증 | 전수 프로브 | 추가 업무 구성 |
|---|---|---|---|---|---|---|---|---|
| FastAPI최종 선택 | 162개 경로 / 172개 작업 | 전체 제품 업무 핸들러 172개 | 172 | 147 | JSON 168 · binary/SSE 2 · no-content 2 | 168 | 172 | 0 |
| Flask라우트 미러 | 162개 경로 / 172개 작업 | 전체 제품 업무 핸들러 0개 | 0 | 0 | 0 | 0 | 172 | 172 |
5. 참고: 동일 `/health` 최소 응답 비교
/health는 최소 framework overhead를 살펴보는 이전 기준선입니다. 최종 성능 평가는 위의 대표 기능 3개 실제 HTTP 측정을 사용합니다. 마지막 열은 3번 평가표의 네 점수를 평균한 종합점수입니다.
| 프레임워크 | HTTP | 응답 일치 | OpenAPI | 응답 Schema | 코드 줄 수 | p50* | p95* | 종합 평균* |
|---|---|---|---|---|---|---|---|---|
| FastAPI최종 선택 | 200 | 일치 | 자동 생성 | 선언·검증 | 3줄 | 0.7603ms | 1.7285ms | 4.98/54개 평가 요소 평균 |
| Flask비교 대상 | 200 | 일치 | 기본 미제공 | 수동 처리 | 3줄 | 0.0766ms | 0.1235ms | 3.48/54개 평가 요소 평균 |
최종 선택: FastAPI
개발 생산성·계약 자동화·검증 안정성·대표 업무 API 성능 네 항목을 각각 25%로 동일하게 평가했습니다. Dashboard 집계·위험 검색·정비 추천 등 대표 기능 3개를 양쪽에 실제 구현한 결과까지 반영했으며, FastAPI는 adapter 코드량·계약 자동화·검증에서 앞서 FastAPI 99.55점, Flask 69.6점으로 FastAPI를 선택했습니다. 이번 결론은 기존 코드를 옮기는 비용이 아니라 새 제품을 구축할 때의 개발 방식과 기본 제공 기능을 기준으로 한 판단입니다.
Flask가 우세한 부분: 대표 기능 3개의 평균 성능 점수와 작은 framework의 단순성입니다.
FastAPI가 우세한 부분: 대표 기능 3개의 총 adapter 코드량, 자동 계약·검증과 전체 제품 구조화입니다.
대표 기능 3개는 FastAPI와 Flask에 동일하게 구현했지만, 전체 172개 제품 업무 작업을 Flask로 다시 구현한 것은 아닙니다. 성능 값은 로컬 Mac loopback과 각 프레임워크의 로컬 서버 stack을 포함한 측정이며 운영 환경 성능을 보장하지 않습니다.