
공모전 프로젝트에서 백엔드 서버는 Django / Flask / Fast API 중에서 하나를 선택해서 사용을 해야 했다.
처음에는 Django를 사용하려 했다. 기존에 자주 사용해 익숙하고 빠르게 구현할 자신이 있었기 때문이다. 하지만 AI 응답 서비스에서는 빠른 응답 속도와 동시 작업 처리 능력이 핵심이라고 판단했다.
이에 따라 Django와 FastAPI의 성능을 비교한 후 선택하기로 했다.
FastAPI 코드 작성
Fastapi 설치
pip install fastapi
Uvicorn 설치
pip install uvicorn
FastAPI를 실행하려면 비동기 호출을 지원하는 Python 웹 서버인 Uvicorn이 필요하므로 함께 설치했다.
main.py 파일 생성 및 코드 작성
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def plaintext_api():
return "FastAPI"
간단하게 "/" 루트 경로로 요청이 들어오면 "FastAPI"를 반환하는 API를 만들었다. 또한, 비동기 방식으로 동작하도록 async를 사용했다.
Django 코드 작성
Django 설치
pip install django==4.2
Django의 4.2 버전을 사용했다.
프로젝트 생성
django-admin startproject django_test
DRF(Django REST Framework) 설치
pip install djangorestframework
REST API 구축을 위해 Django REST Framework(DRF)를 설치하고, INSTALLED_APPS에 등록했다.
INSTALLED_APPS = [
...
'rest_framework',
]
urls.py 등록
...
path('', include('tests.urls')),
...
tests라는 앱을 생성하여 엔드포인트를 연결했다.
views.py 작성
...
async def test_api(request):
return HttpResponse("Django")
...
FastAPI와 동일하게 "Django"를 반환하는 비동기 함수를 작성했다.
Locust 부하 테스트
성능 테스트를 위해 UI를 지원하는 Locust를 사용했다.
Locust 설치
pip install locust
locustfile.py 작성
from locust import HttpUser, task, between
import time
class APIUser(HttpUser):
# 각 요청 사이의 대기 시간 (1~2초 랜덤)
wait_time = between(1, 2)
@task
def send_requests(self):
self.client.get("/")
time.sleep(2)
실행
locust -f locustfile.py
Locust 실행 후, http://0.0.0.0:8089에 접속하면 이용자 수, 사용자 증가 속도, 실행 시간을 설정할 수 있다.

FastAPI, Django 서버 실행
두 프레임워크의 성능을 비교하기 위해 순차적으로 FastAPI와 Django 서버를 실행했다.
FastAPI 실행
uvicorn main:app --reload
Django 실행
uvicorn django_test.asgi:application
성능 비교 결과

Locust를 사용해 Django와 FastAPI의 성능을 비교한 결과, 초당 요청 처리량(RPS)은 두 프레임워크가 비슷했으나, 응답 속도에서는 FastAPI가 약 5배 더 빠른 성능을 보였다.
항목 | FastAPI | Django(DRF) |
비동기 지원 | 기본적으로 지원 (async/await) | 기본적으로 동기 방식, ASGI 설정 필요 |
성능 | 빠름 (약 5배 빠른 응답 속도) | 상대적으로 무거움 |
구현 난이도 | 비교적 간단, 경량 API 개발에 적합 | 다양한 기능 제공, 학습 곡선이 있음 |
부하 테스트 결과 (Locust) | 높은 초당 요청 처리량 (RPS), 빠른 응답 속도 | RPS는 유사하나 응답 속도가 느림 |
사용 사례 | AI 응답 서비스, 비동기 API | CRUD API, 대규모 웹 서비스 |
- Django: 기본적으로 동기적인 기능에 최적화되어 있으며, ASGI 서버와 같은 추가적인 설정이 필요했다. 또한, DRF를 활용하면 API 구축이 용이하지만 다양한 내장 기능으로 인해 상대적으로 무거운 편이었다.
- FastAPI: 기본적으로 비동기를 지원하며, 가볍고 빠르게 동작할 수 있었다. 특히 AI 응답 서비스처럼 빠른 처리 속도와 동시 작업이 중요한 환경에서는 더 적합하다고 판단했다.
이러한 이유로 이번 프로젝트에서는 FastAPI를 선택했다.
마무리
동기적 방식과 비동기적 방식을 적절히 조합하면 더욱 좋은 성능을 기대할 수 있을 것으로 보인다.
또한, 테스트 코드 작성이 부족하다고 판단했으며, 자동 배포시에도 사용해야 하니 테스트 코드 작성에 대한 연습도 필요할 것이다.
참고
https://fastapi.tiangolo.com/ko/
https://fastapi.tiangolo.com/ko/async/
https://medium.com/@modabbirtarique/mastering-fastapi-8fa2af2c9beb
'Python' 카테고리의 다른 글
AI 모델 비교하기 GPT, Deepseek, Mistralai (0) | 2025.04.04 |
---|---|
Python GC 가비지 컬렉터: 메모리 관리의 이해 (1) | 2025.01.15 |
Python asyncio 비동기 처리 async/await (0) | 2025.01.09 |
Redis-Py : ZSet(Sorted Set) 랭킹 구현 활용 (1) | 2024.12.08 |
[TIL]내이배움캠프 - DRF + React 좋아요 기능 (0) | 2024.05.10 |