API 성능 테스트와 부하 테스트 (locust 활용)

Django DRF로 개발한 API가 실제 서비스 환경에서 얼마나 많은 사용자를 감당할 수 있는지 확인하고, 성능 병목 지점을 파악하는 테스트 방법

성능 테스트의 필요성

  • 응답 시간 지연: 사용자가 몰리면 서버 응답 속도 급격히 저하

  • 서버 다운: 감당 가능한 트래픽 초과 시 서비스 전체 중단

  • 비용 증가: 비효율적인 코드로 인한 서버 리소스 과다 사용

Locust 선택 이유

  • Python으로 테스트 코드 작성 가능

  • 개발자 친화적인 코드 기반 시나리오 관리

  • 낮은 진입 장벽과 간단한 설치

  • 분산 모드 지원으로 대규모 가상 사용자 생성

  • 실시간 웹 UI 모니터링

Locust 기본 설정

설치

pip install locust

기본 테스트 스크립트

from locust import HttpUser, task, between

class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task
    def get_posts(self):
        self.client.get("/api/v1/posts/")

    def on_start(self):
        print("Starting test...")

실행

locust -f locustfile.py --host=http://127.0.0.1:8000

실무 시나리오 구현

인증 처리

def on_start(self):
    creds = random.choice(TEST_USERS)
    res = self.client.post("/api/v1/users/login/", json=creds)
    
    if res.status_code == 200:
        self.access_token = res.json().get("access")
        self.client.headers["Authorization"] = f"Bearer {self.access_token}"

다중 작업과 가중치

@task(8)  # 읽기 작업 8:2 비율
def get_posts_and_comments(self):
    res = self.client.get("/api/v1/posts/")
    # 추가 로직

@task(2)  # 쓰기 작업
def create_post(self):
    self.client.post("/api/v1/posts/", json={...})

결과 분석 지표

  • 실패율 (Failures): 0%가 아니면 서버 부하 초과 상태

  • 응답 시간 (90%ile): 90% 사용자가 경험하는 응답 시간

  • RPS (Requests Per Second): 초당 처리 가능한 요청 수

주요 주의사항

  • 운영 환경에서 절대 부하 테스트 금지

  • 스테이징 환경에서만 테스트 수행

  • 점진적 부하 증가로 한계점 파악

  • API Throttling 설정 확인

  • 서버 모니터링 도구와 함께 사용

Last updated