<모여행> k6를 선택한 이유 & 성능 테스트의 중요성

Cori1304·2025년 9월 27일
0

GOORM-DEEPDIVE

목록 보기
22/23

개요

이 문서는 왜 성능 테스트 툴로 k6를 선택 했는지와 성능 테스가 무엇인지 기술한 글 입니다.

성능 테스트란?

성능 테스트 정의

성능 테스트(Performance Testing)는 소프트웨어나 시스템이 특정 작업 부하에서 얼마나 빠르게, 그리고 안정적으로 동작하는지를 평가하는 모든 테스트 활동을 총칭합니다. 단순히 기능이 올바르게 작동하는지를 확인하는 것을 넘어, 시스템의 속도, 확장성, 안정성을 측정하는 것이 핵심 (광범위하게 사용되기에 성능 테스트 범위와 함께 설명)

성능 테스트의 범위

성능 테스트는 단순히 시스템의 '속도'만 측정하는 것이 아니라, 다양한 측면에서 시스템의 한계와 효율성을 평가합니다. 대표적인 테스트 유형은 다음과 같습니다.

부하 테스트(Load Testing): 시스템이 예상되는 정상적인 사용자 수와 트랜잭션 양을 처리할 수 있는지 확인합니다. 예를 들어, 웹사이트에 동시에 1,000명의 사용자가 접속했을 때 응답 시간이 적절한지 테스트합니다.

스트레스 테스트(Stress Testing): 시스템이 최대 부하 용량을 초과하는 비정상적인 상황에서 어떻게 동작하는지 확인합니다. 시스템이 갑작스러운 트래픽 폭증에 무너지지 않고, 복구 능력을 갖추고 있는지 검증합니다.

내구성 테스트(Endurance Testing): 시스템이 장시간 동안 지속적인 부하를 견딜 수 있는지 확인합니다. 메모리 누수나 성능 저하 없이 안정적으로 운영되는지 테스트합니다.

볼륨 테스트(Volume Testing): 대량의 데이터(데이터베이스, 파일 등)를 처리할 때 시스템의 성능 저하가 발생하는지 확인합니다.

성능테스트 지표와 예시

응답 시간(Response Time): 사용자가 요청을 보낸 시점부터 응답을 받기까지 걸리는 시간

예시: "상품 구매" 요청에 대한 평균 응답 시간은 5초, 이는 사용자가 상품을 구매하기 위해 5초를 기다려야 한다는 의미로, 사용자 경험이 부정적이라는 것을 유추할 수 있습니다.

TPS (Transactions Per Second): 시스템이 1초 동안 처리할 수 있는 트랜잭션(요청)의 수

예시: 초당 100건의 구매 요청을 처리할 수 있는 시스템있고 만약 이벤트로 인해 초당 200건의 요청이 몰리면, 시스템은 정상적으로 처리하지 못하고 응답 시간이 지연되거나 오류가 발생할거라고 예측 가능합니다.

오류율(Error Rate): 테스트 도중 발생하는 오류의 비율

예시: 부하가 증가함에 따라 오류율이 5%로 상승했습니다. 이는 과부하 상황에서 시스템의 안정성이 저하되어 요청을 제대로 처리하지 못하고 있다는 것을 의미합니다.

CPU/메모리 사용량: 시스템 자원(CPU, 메모리)의 사용률

예시: 동시 접속자 수가 500명을 초과하자, CPU 사용량이 90%까지 치솟는다면 이는 시스템이 처리할 수 있는 부하의 한계에 도달했음을 보여주는 병목 지표입니다.

동시 사용자 수(Concurrent Users): 시스템이 성능 저하 없이 동시에 처리할 수 있는 최대 사용자 수

예시: A 시스템은 1,000명의 동시 사용자까지는 응답 시간 2초 이내를 유지하지만, 1,200명이 접속하는 순간부터 응답 시간이 급격히 늘어납니다.

성능 테스트의 중요성

  1. 사용자 경험(UX) 증진 및 이탈률 감소
    대표적으러 2초의 법칙과 3초의 마지노선 이론에 따르면 사용자는 웹페이지 이용시 2~3초라는 시간이 지나면 시비스 이탈률이 급격히 증가한다고 합니다. 성능 테스트는 이러한 잠재적 문제를 사전에 파악하고 해결하여, 사용자들이 빠르고 쾌적한 환경에서 서비스를 이용할 것이라고 예측할 수 있도록 도와줍니다.

  2. 비즈니스 손실 예방
    예측하지 못한 트래픽 폭증으로 시스템이 마비 또는 지연된다면, 그 기간 동안의 모든 비즈니스 활동(예: 온라인 판매, 서비스 제공)이 중단됩니다. 이는 곧바로 매출 손실, 기업 이미지 실추, 그리고 고객 신뢰도 하락으로 이어집니다. 성능 테스트는 시스템의 한계점을 미리 파악하고, 잠재적인 위험 상황에 대비하여 비즈니스 연속성을 확보할 수 있도록 도와줍니다.

  3. 시스템의 안정성과 확장성 확보
    성능 테스트를 통해 얻은 지표(CPU/메모리 사용량, 오류율 등)는 시스템의 병목 현상과 잠재적 오류를 발견하는 데 도움을 줍니다. 이러한 데이터를 바탕으로 시스템을 최적화하면, 더 적은 자원으로도 더 많은 부하를 효율적으로 처리할 수 있습니다. 이는 비용 효율적인 시스템 운영을 가능하게 하며, 향후 더 많은 사용자를 수용하기 위한 확장 계획을 수립하는데 도움을 줍니다.


성능 테스트 툴

성능 테스트 툴 소개에서 내용을 스크립하였습니다.

Apache JMeter

Apache JMeter는 강력한 성능 테스트 도구로, 다양한 프로토콜을 지원한다.

장점 및 특징

  • 다양한 프로토콜 지원: HTTP, HTTPS, FTP, JDBC, JMS, LDAP, SOAP, TCP 등 다양한 프로토콜 지원
  • 확장성: 플러그인을 통해 기능을 확장 가능
  • 분산 테스트: 여러 머신에서 테스트를 실행하여 부하를 분산할 수 있다.
  • 강력한 GUI: 사용자 친화적인 GUI로 테스트 계획을 쉽게 작성할 수 있다.
  • 스크립트 지원: BeanShell, Groovy 등의 스크립트를 사용하여 복잡한 테스트 시나리오를 작성할 수 있다.

단점

  • 고사양 요구: 많은 리소스를 소모하므로 고사양의 하드웨어가 필요할 수 있다.
  • 복잡한 설정: 고급 기능을 사용하려면 복잡한 설정과 스크립팅이 필요할 수 있다.
  • 실시간 모니터링 제약: 실시간으로 대규모 테스트를 모니터링하는 데 제약이 있을 수 있다.
    러닝 커브 (기본적인 사용은 쉽지만, 고급 기능을 익히는 데는 시간이 필요함)

Gatling

실시간 그래프와 함께 상세한 보고서를 제공하는 유료 성능 테스트 도구 (JDK 8 이상이 요구)

장점

  • 고성능: 비동기 방식으로 많은 사용자 요청을 처리할 수 있다.
  • 확장성: Scala를 기반으로 스크립트를 작성하여 복잡한 테스트 시나리오를 구현할 수 있다.
  • 실시간 보고: 테스트 진행 중 실시간으로 성능 지표를 모니터링할 수 있다.
  • 자동 보고서 생성: 테스트가 끝나면 상세한 HTML 보고서를 자동으로 생성한다.
  • DevOps 친화적: 코드로 시나리오를 작성하기 때문에 버전 관리 시스템과 CI/CD 파이프라인에 통합이 용이

단점

  • 유료 정책
  • 러닝 커브: Scala 언어에 익숙하지 않은 사용자는 시나리오 작성이 어려울 수 있다.
  • 복잡한 설정: 고급 기능을 사용하기 위해서는 복잡한 설정과 코드 작성이 필요할 수 있다.
  • 자원 요구: 대규모 테스트를 실행할 때는 높은 하드웨어 자원이 필요할 수 있다.

K6

성능 테스트 스크립트를 작성하고 실행할 수 있는 오픈 소스 도구

장점

  • CLI 도구: 커맨드 라인 인터페이스(CLI)를 통해 쉽게 테스트를 실행하고 결과를 확인할 수 있다.
  • 고성능: 단일 프로세스로 수천 개의 가상 사용자를 처리할 수 있다.
  • 확장성: Grafana와 같은 모니터링 도구와 쉽게 통합할 수 있다.
  • DevOps 친화적: CI/CD 파이프라인에 통합하여 자동화된 테스트 환경을 구축하기 용이하다.
  • 경량화: 비교적 가벼운 도구로, 빠르고 간편하게 성능 테스트를 수행할 수 있다.

단점

  • 고급 기능 한계: JMeter나 Gatling에 비해 고급 기능이 부족할 수 있다.
  • 제한된 프로토콜 지원: HTTP/HTTPS 프로토콜 위주로 지원
    다양한 프로토콜을 필요로 하는 경우 한계가 있을 수 있다.
  • 러닝 커브: JavaScript에 익숙하지 않은 사용자는 초기 학습이 필요할 수 있다.

Locust

장점

  • 실시간 피드백: 웹 인터페이스에서 실시간으로 결과를 확인할 수 있어 테스트 진행 상황을 쉽게 모니터링할 수 있다.
  • 확장성: 분산 로드를 통해 대규모 부하 테스트가 가능하다.
  • 커스터마이즈 가능: Python의 강력한 기능을 활용하여 복잡한 시나리오를 쉽게 작성할 수 있다.
  • 경량화: 간편한 설치와 사용으로 빠르게 테스트를 시작할 수 있다.

단점

  • 고급 기능 한계: JMeter와 같은 도구에 비해 고급 기능이 부족할 수 있다.
    성능 제한: 대규모 테스트에서는 성능 제한이 있을 수 있으며, 분산 로드를 필요로 할 수 있다.
    Python 의존성: Python에 익숙하지 않은 사용자는 초기 학습이 필요할 수 있다.

k6를 선택한 이유

테스트 툴 희망조건

  1. 가볍운 성능 (로컬에서 돌리기 위해서)
  2. 직관적인 사용 방법
  3. 테스트 방법과 결과 공유가 간편한 것
  4. 학습 곡선이 낮을 것

k6를 선택한 이유

  1. 가벼운 성능 (로컬 테스트): K6는 Go 언어로 개발되어 매우 경량화되어 있고, 다른 툴들 많은 자원을 소모하는 것과 달리, K6는 비교적 적은 리소스로 테스트 가능 합니다.

(grafana) Comparing k6 and JMeter for load testing 에서 제공한 결과입니다. 표와 같이 K6는 비교했던 테스트 툴들에 비해서 메모리 사용량이 적으면서 RTS가 많은 것을 볼 수 있습니다.

RTS: Requests Per Second는 '초당 요청 수'를 의미합니다. 즉, 1초 동안 시스템이 처리할 수 있는 요청의 수를 나타내는 성능 지표

  1. 직관적인 사용 방법 및 쉬운 공유: K6는 CLI 기반의 도구로, 복잡한 GUI 없이 명령어를 통해 테스트를 실행하고 결과를 즉시 확인할 수 있습니다. 테스트 결과를 JSON 형태로 출력할 수 있어, 이를 Jira나 Confluence 같은 협업 도구에 쉽게 첨부하여 팀원들과의 공유를 간편하게 만들 수 있습니다.

  2. 낮은 학습 곡선: K6는 자바스크립트(JavaScript) 기반으로 스크립트를 작성합니다. 이는 대다수의 웹 개발자에게 익숙한 언어이므로, 별도의 언어 학습(예: Gatling의 Scala, Locust의 Python) 없이도 팀원들이 빠르게 테스트 스크립트를 작성하고 유지보수할 수 있습니다. 이는 테스트 도입의 초기 장벽을 크게 낮춥니다.

결론

성능 테스트는 개발의 마지막 단계에서 시스템의 안정성과 비즈니스 가치를 최종적으로 검증하는 중요한 절차입니다. <모여행>은 모든 기능 구현 이후, 최종적인 시스템의 완성도를 높이기 위해 k6를 활용하여 아래 3가지를 목표를 수행하여 더 좋은 서비스를 개발하겠습니다.

초기 목표: MVP 기능(항공권 검색/예매)에 대해 응답 시간 3초 이내, 오류율 1% 미만을 목표로 부하 테스트를 진행하겠습니다.

테스트 자동화: 향후 CI/CD 파이프라인에 K6를 연동하여 코드 배포 시마다 자동으로 성능 회귀 테스트를 수행하도록 하겠습니다.

지속적 관리: Grafana와 연동하여 주요 지표를 지속적으로 모니터링하고, 성능 저하가 감지될 경우 선제적으로 대응하겠습니다.

참고 자료

(velog) 성능테스트 툴 소개

(velog)Spring Boot로 K6 & Grafana를 활용한 부하테스트 해보기

(f-lab) 성능 테스트의 중요성과 목적 그리고 효과

(f-lab) 성능 테스트 중요성

(kakao-tech) 실시간 메시징 시스템 개발 - “성능 테스트 설계와 분석”

성능테스트 (부하테스트 도구 비교) - jmeter, k6, ngrinder, locust
https://web.dev/case-studies/t-mobile-case-study?hl=en

https://loosie.tistory.com/821

https://www.mabl.com/articles/what-is-performance-testing

profile
개발 공부 기록

0개의 댓글