왜 성능 테스트를 하는가
서비스를 오픈하기 전에 서버가 예상 트래픽을 감당할 수 있는지 확인하지 않으면, 런칭 당일 서버가 다운되는 사고가 발생한다. 성능 테스트는 서버의 처리 능력 한계를 사전에 파악하고, 병목 지점을 찾아 개선하기 위한 과정이다. 서버가 초당 몇 개의 요청을 처리할 수 있는지, 동시 접속자가 몇 명까지 올라가면 응답 시간이 급격히 느려지는지, 어느 지점에서 서버가 멈추는지를 측정한다.
성능 테스트의 유형
부하 테스트(Load Test)는 예상 트래픽 수준에서 서버가 정상적으로 동작하는지 확인하는 테스트다. 목표 동시 접속자 수와 요청량을 설정하고 일정 시간 동안 부하를 유지하면서 응답 시간, 에러율, 처리량을 측정한다. 스트레스 테스트(Stress Test)는 서버의 한계를 찾기 위해 부하를 점진적으로 증가시키는 테스트다. 서버가 정상 동작하는 최대 부하점(Breaking Point)을 파악하는 것이 목적이다. 스파이크 테스트(Spike Test)는 갑자기 트래픽이 폭증하는 상황을 시뮬레이션한다. 이벤트 오픈, 뉴스 바이럴 같은 순간적인 트래픽 급증에 서버가 어떻게 반응하는지 확인한다. 지구력 테스트(Soak Test)는 장시간에 걸쳐 일정 부하를 유지하면서 메모리 누수나 자원 고갈 같은 시간 의존적 문제를 탐지한다.
핵심 지표
성능 테스트에서 반드시 측정하는 지표가 있다. 처리량(Throughput)은 서버가 단위 시간당 처리하는 요청 수다. 보통 RPS(Requests Per Second)로 표현한다. 응답 시간(Response Time)은 요청을 보낸 시점부터 응답을 받는 시점까지의 시간이다. 평균값보다 95 퍼센타일, 99 퍼센타일 값이 더 중요하다. 평균은 정상이어도 상위 1% 사용자의 응답 시간이 10초를 넘으면 체감 품질이 나쁘다. 에러율(Error Rate)은 전체 요청 중 실패한 요청의 비율이다. 부하가 증가할수록 에러율이 급증하는 지점이 서버의 처리 한계다. 동시 접속자 수(Concurrent Users)는 동시에 서버와 통신하고 있는 클라이언트의 수다.
주요 성능 테스트 도구
Apache JMeter는 가장 널리 사용되는 오픈소스 성능 테스트 도구다. GUI 기반으로 테스트 시나리오를 설계하고, HTTP, HTTPS, JDBC, FTP 등 다양한 프로토콜을 지원한다. 복잡한 시나리오(로그인 후 특정 페이지 접근)를 구성할 수 있어 실제 사용자 행동을 모사하기 좋다. k6은 Grafana Labs가 개발한 현대적인 성능 테스트 도구다. JavaScript로 테스트 스크립트를 작성하며, CLI 기반으로 CI/CD 파이프라인에 통합하기 쉽다. Locust는 Python 기반 도구로, 테스트 코드를 Python으로 작성하므로 개발자에게 진입 장벽이 낮다. ab(Apache Bench)는 간단한 HTTP 성능 테스트에 사용되며, 명령어 한 줄로 빠르게 기초 성능을 측정할 수 있다.
테스트 결과 분석과 대응
성능 테스트 결과에서 병목이 발견되면 원인을 분석하여 대응한다. CPU가 병목이면 코드 최적화나 서버 증설을 검토한다. 메모리가 병목이면 캐싱 전략을 개선하거나 메모리를 증설한다. 디스크 I/O가 병목이면 SSD로 교체하거나 인덱스를 최적화한다. 네트워크가 병목이면 CDN 도입이나 대역폭 증설을 고려한다. 성능 테스트는 일회성이 아니라 코드 변경, 인프라 변경 시마다 반복 수행하는 것이 원칙이다.