본문 바로가기
Python

FastAPI와 Django 비교 테스트

by Byeong 2025. 3. 13.

 공모전 프로젝트에서 백엔드 서버는 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에 접속하면 이용자 수, 사용자 증가 속도, 실행 시간을 설정할 수 있다.

 

 

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://wikidocs.net/175875

https://medium.com/@modabbirtarique/mastering-fastapi-8fa2af2c9beb