본문 바로가기
🛠️ IT 실전 가이드 (SW 도구)

내 서버는 몇 명까지 버틸까? 'JMeter' 부하 테스트 3분 완벽 가이드 (놀이공원 비유)

by 데브프리 2026. 7. 28.

안녕하세요, 여러분의 든든한 IT 길잡이 데브프리입니다.

 

스프링 부트나 Node.js로 열심히 백엔드 서버를 만들고, 포스트맨(Postman)으로 테스트해보니 응답 속도가 0.1초 만에 척척 나옵니다. "아싸, 내 서버 완벽해! 당장 출시하자!"라고 생각하시나요?

 

하지만 내 컴퓨터(localhost)에서 나 혼자 접속할 때 빠른 것은 당연한 일입니다. 만약 이벤트가 터져서 1초 만에 1,000명의 유저가 동시에 접속한다면 여러분의 서버는 어떻게 될까요? 십중팔구 DB가 뻗거나 500 에러를 뿜어내며 기절해 버릴 것입니다.

 

"그럼 1,000명이 들어왔을 때 서버가 안 터지는지 어떻게 미리 확인하죠? 제 친구 1,000명을 부를 수도 없고요!"

이럴 때 백엔드 개발자를 구원해 주는 필수 도구가 바로 Apache JMeter(제이미터)입니다. 오늘은 서버의 체력을 미리 측정해 보는 '부하 테스트'의 1인자, JMeter의 핵심 사용법을 '놀이공원 개장 시뮬레이션'에 비유하여 아주 쉽게 떠먹여 드리겠습니다!

 

1. JMeter란 무엇인가요? (가짜 손님을 싣고 오는 관광버스)

JMeter는 내가 만든 서버(API)에 수백, 수천 명의 가상 유저를 동시에 접속시켜서, 서버가 트래픽을 얼마나 잘 버티는지(성능) 테스트해 주는 오픈소스 소프트웨어입니다.

JMeter 부하 테스트 가상 유저 트래픽 비유
JMeter는 내가 만든 놀이공원(서버)이 터지지 않는지 확인하기 위해, 가짜 로봇 손님들을 관광버스에 잔뜩 태워 한꺼번에 입장시켜보는 시뮬레이션 도구입니다.

개발자가 코드 최적화(인덱스 추가, 쿼리 튜닝 등)를 진행했다면, "그래서 최적화 전보다 몇 명이 더 접속할 수 있게 된 건데?"라는 것을 숫자로 증명해야 합니다. JMeter는 바로 그 증명서(성능 리포트)를 뽑아주는 역할을 합니다.

 

2. JMeter의 3가지 핵심 요소 (버스와 놀이기구, 그리고 CCTV)

JMeter를 처음 켜면 복잡한 영어 메뉴 때문에 당황하기 쉽습니다. 하지만 딱 3가지 핵심 개념만 알면 됩니다.

  1. Thread Group (스레드 그룹) = 관광버스 대절하기
    • "손님을 몇 명 보낼 것인가?", "몇 초 만에 다 내리게 할 것인가?"를 결정합니다. 즉, 서버에 접속할 가상 유저의 수와 속도를 통제하는 버스입니다.
  2. Sampler (샘플러) = 어떤 놀이기구를 탈 것인가?
    • 손님들이 놀이공원에 들어와서 '회원가입' 놀이기구를 탈지, '게시글 조회' 놀이기구를 탈지 정해줍니다. 보통 HTTP Request를 사용해서 "어떤 URL로 GET/POST 요청을 보낼지"를 세팅합니다.
  3. Listener (리스너) = 결과를 기록하는 CCTV
    • 손님들이 놀이기구를 타고 만족했는지(200 OK), 아니면 기구가 고장 나서 튕겨 나갔는지(500 Error)를 통계로 보여주는 전광판입니다.

 

3. 실전! 3분 만에 부하 테스트 세팅하기

JMeter를 다운로드하고 실행(bin 폴더의 jmeter.bat 또는 jmeter.sh)했다면, 다음 순서대로 세팅해 보세요.

JMeter 세팅 순서 Thread Group Sampler Listener
JMeter 테스트는 [유저 수 설정] ➡️ [접속할 API 주소 입력] ➡️ [결과 볼 화면 추가]라는 3단계로 아주 쉽게 완성됩니다.

STEP 1: 가상 유저 세팅하기 (Thread Group)

왼쪽 Test Plan 우클릭 ➡️ Add ➡️ Threads (Users) ➡️ Thread Group을 클릭합니다.

  • Number of Threads (users): 100 (100명의 유저를 보내겠다!)
  • Ramp-up period (seconds): 10 (이 100명을 10초에 걸쳐서 서서히 보내겠다! 즉, 1초에 10명씩 접속)
  • Loop Count: 1 (이 행동을 1번만 하겠다)

STEP 2: 공격(?)할 API 주소 적기 (HTTP Request)

방금 만든 Thread Group 우클릭 ➡️ Add ➡️ Sampler ➡️ HTTP Request를 클릭합니다.

  • Protocol: http (또는 https)
  • Server Name or IP: localhost (로컬 서버 테스트 시)
  • Port Number: 8080 (스프링 부트 기본 포트)
  • HTTP Request: GET / Path: /api/posts (게시글 목록 조회 API)

STEP 3: 결과 화면 띄우기 (Listener)

다시 Thread Group 우클릭 ➡️ Add ➡️ Listener ➡️ View Results Tree와 Summary Report 2개를 추가해 줍니다.

  • 이제 상단의 초록색 재생 버튼(▶)을 누르면 부하 테스트가 시작됩니다!

 

💡 [데브프리의 심층 면접 꿀팁: 진짜 대규모 테스트는 '화면 없이(Non-GUI)' 돌려야 한다!]

면접관이 "JMeter로 실제 대규모 부하 테스트를 할 때 주의할 점이 있나요?"라고 묻는다면 완벽한 합격 시그널입니다!

방금 우리가 한 것처럼 JMeter의 예쁜 화면(GUI)을 띄워놓고 수천, 수만 명의 부하를 주면 어떻게 될까요? 내 서버가 죽기 전에, JMeter 화면의 그래프를 렌더링하느라 내 컴퓨터(테스트 PC)의 메모리가 먼저 터져버립니다!

그래서 실무에서는 방금 한 것처럼 세팅(Test Plan)만 GUI 화면에서 JMX 파일로 저장한 뒤, 실제 부하를 줄 때는 까만 터미널 창에서 화면 없이 명령어(CLI, Non-GUI 모드)로만 실행하는 것이 국룰입니다. (예: jmeter -n -t test.jmx -l result.jtl) 이 팁 하나만 어필해도 면접관은 "아, 이 친구 진짜 실무 환경까지 꼼꼼히 고민해 봤구나" 하고 감탄할 것입니다!

 

4. 리포트 분석: 내 서버의 성적표 읽는 법

테스트가 끝나면 Summary Report를 열어보세요. 영어와 숫자가 빼곡하지만, 실무에서는 딱 3가지 데이터만 봅니다.

분석 지표 의미 이상적인 수치
Error % (에러율) 요청 중 실패한 비율. 서버가 죽었는지 확인하는 가장 중요한 지표. 0% (1%라도 나오면 튜닝이 필요함)
Throughput (처리량 / TPS) 서버가 1초당 몇 건의 요청을 성공적으로 처리했는가? 숫자가 클수록 좋음 (서버의 한계 체력)
Average (평균 응답 속도) 유저가 요청을 보내고 응답을 받을 때까지 걸린 평균 시간 (ms). 보통 200~500ms 이하 (높을수록 로딩이 김)

만약 1,000명을 보냈는데 Error %가 30%가 나왔다면, 여러분의 서버는 1,000명을 버틸 수 없는 상태인 것입니다. 이때 데이터베이스 인덱스(Index)를 추가하거나 캐싱(Redis)을 적용한 뒤 JMeter를 다시 돌려보세요. Error %가 0%로 줄고 Throughput이 확 올라가는 짜릿한 경험을 하실 수 있습니다!

 

마무리

"개발은 돌아가게 만드는 것이 1차 목표이고, 트래픽을 버티게 만드는 것이 최종 목표다."라는 말이 있습니다.

 

JMeter는 내 코드가 단순히 기능만 하는 깡통인지, 아니면 수천 명의 유저를 감당할 수 있는 단단한 인프라인지 객관적으로 증명해 주는 최고의 도구입니다. 이력서에 "JMeter를 활용하여 TPS를 30% 향상시켰습니다"라고 한 줄 적는 순간, 면접관의 눈빛이 확연히 달라지는 것을 느끼실 수 있을 겁니다.

 

오늘부터 포스트맨으로만 만족하지 말고, JMeter로 내 서버에 스트레스를 줘 보는 건 어떨까요?

 

오늘의 데브 노트가 유익하셨다면 공감과 댓글 부탁드립니다. 지금까지 데브프리였습니다. 감사합니다!

 

👉 대규모 트래픽 처리 중 내 서버가 뻗을 위험도는? 카프카(Kafka) 리밸런싱 타임아웃 계산기 [링크]