HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[New] 타일러팀
[New] 타일러팀
/
코코아 헤어샵
코코아 헤어샵
/
🧬
성능 테스트
/
🌋
트래픽 부하 테스트
🌋

트래픽 부하 테스트

JMeter 레퍼런스

웹사이트 스트레스 테스트를 위한 7가지 서버 성능 테스트 도구
웹 사이트 소유자 중 가장 초보자조차도 어느 시점에서 웹 사이트 성능을 테스트했습니다. 그러나 이러한 테스트의 대부분은 일반적으로 로딩 속도 또는 사용자 경험 지수에 중점을 둡니다. 하지만 부하 테스트는 어떻습니까? 대부분의 웹 사이트는 일반적으로 매우 규칙적인 트래픽 수준에 취약하지만 일부 [...]
웹사이트 스트레스 테스트를 위한 7가지 서버 성능 테스트 도구
https://www.webhostingsecretrevealed.net/ko/blog/web-tools/load-testing-tools/
웹사이트 스트레스 테스트를 위한 7가지 서버 성능 테스트 도구
[Spring] 웹 어플리케이션 성능 테스트 (1) - JMeter
웹 어플리케이션 성능 테스트를 툴은 자바 오픈 소스 Apache Bench, Apache JMeter, 네이버에서 Grinder를 이용해서 만든 nGrinder, Gatling 등등이 있습니다. 이번 포스팅에선 웹 어플리케이션 성능 테스트 오픈 소스인 JMeter에 대해서 알아보겠습니다. Apache에서 만든 자바로 만들어진 웹 어플리케이션 성능 테스트 오픈 소스입니다. JMeter를 이용해서 아래와 같은 테스트를 할 수 있습니다.
[Spring] 웹 어플리케이션 성능 테스트 (1) - JMeter
https://effortguy.tistory.com/164
[Spring] 웹 어플리케이션 성능 테스트 (1) - JMeter
Jmeter를 활용한 서버 부하 테스트
Jmeter는 Apache에서 재공하는 웹사이트 성능 측정을 할 수 있는 오픈소스 라이브러리다. 만약 자바가 설치되어 있지 않다면, JDK 설치도 해줘야 한다. Jmeter 실행은 다운로드 받은 폴더 압축을 풀고, bin 안에서 cmd창을 열어 jmeter.bat을 실행하면 된다. Jemeter로 사용할 수 있는 여러 플러그인들이 있으며, 이는 ext 폴더 안에 jar 파일을 추가해주면된다.
Jmeter를 활용한 서버 부하 테스트
https://kim6394.tistory.com/256
Jmeter를 활용한 서버 부하 테스트
Video preview
 

JMeter 열기 (MAC)

open /usr/local/bin/jmeter

password

$2a$10$c/PwCYTZhxxKPoCCuqzMNulxF3VMel2BHVizwtbBNiONQkHgTb3lC

header

Content-Type application/json

/reservations/reservation-times/hairshops/1

{ "date": "${__RandomDate(,,2022-07-29,,)}", "reservationStartTime": "00:00", "reservationEndTime" : "23:59" }

/reservations/v1/reservation-time/hairshops/1

{ "date": "${__RandomDate(,,2022-07-29,,)}" }

/reservations

{ "name" : "사용자", "phoneNumber": "010-1234-5678", "date" : "${__RandomDate(,,2022-07-29,,)}", "time" : "1${__Random(0,9)}:${__Random(0,1)*3}0", "request" : "예쁘게 잘라주세요.", "paymentAmount" : 20000, "userId" : 1, "hairshopId" : 1, "designerId" : 1, "menuId" : 1 }

/reservations/v1

{ "name" : "사용자", "phoneNumber": "010-1234-5678", "date" : "${__RandomDate(,,2022-07-29,,)}", "time" : "1${__Random(0,9)}:${__Random(0,1)*3}0", "request" : "예쁘게 잘라주세요.", "paymentAmount" : 20000, "userId" : 1, "hairshopId" : 1, "designerId" : 1, "menuId" : 1 }

DataBase

insert into users (id, auth, email, password) values (1, "USER", "example@naver.com", "$2a$10$c/PwCYTZhxxKPoCCuqzMNulxF3VMel2BHVizwtbBNiONQkHgTb3lC"); insert into hairshop(id, name, phone_number, start_time, end_time, reservation_range, reservation_start_time, reservation_end_time, same_day_available, road_name_number, profile_img, introduction, user_id) values(1, '헤어샵', '010-1234-5678', '00:00', '23:30', '1', '00:00', '23:30', true, '주소', '이미지', '소개', 1); insert into designer (id, name, profile_img, introduction, position, hairshop_id) values (1, "designer", "image", "hello", "DESIGNER", 1); insert into designer (id, name, profile_img, introduction, position, hairshop_id) values (2, "designer", "image", "hello", "DESIGNER", 1); insert into designer (id, name, profile_img, introduction, position, hairshop_id) values (3, "designer", "image", "hello", "DESIGNER", 1); insert into designer (id, name, profile_img, introduction, position, hairshop_id) values (4, "designer", "image", "hello", "DESIGNER", 1); insert into designer (id, name, profile_img, introduction, position, hairshop_id) values (5, "designer", "image", "hello", "DESIGNER", 1); insert into menu(id, name, price, discount, gender, type, exposed_time, image, hairshop_id) values(1, '컽', 9999, 99, 'man', 'makeup', 30, '이미지', 1);

ReservationService

List<Designer> notReservedDesigners = designerRepository.findByHairshopId(hairshopId); for (Designer designer : notReservedDesigners) { if (!designers.contains(designer)) { responseDtos.add(ReservationConverter.toReservationTimeResponseDto( designer, times)); } }

DesignerRepository

List<Designer> findByHairshopId(Long hairshopId);
 

Jmeter 파일

kokoa.jmx
55.1KB

CSV 파일

random_time.csv
0.3KB
 
  • Connection TimeOut 문제 (30초 이상 waiting 걸리면 에러나는 상황)
    • @GeneratedValue(strategy = GenerationType.AUTO) 를 사용해서 문제 발생한 것
    • HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그
      안녕하세요! 공통시스템개발팀에서 메세지 플랫폼 개발을 하고 있는 이재훈입니다. 메세지 플랫폼 운영 장애를 바탕으로 HikariCP에서 Dead lock이 발생할 수 있는 case와 Dead lock을 회피할 수 있는 maximum pool size를 구하는 방법을 공유하고자 합니다. 동일한 이슈를 해결하기 위해 고생하시는 분들께 도움이 되길 바라며 글을 작성하였습니다. 추가적으로 이 문제를 해결하면서 발견한 JPA / hibernate 관련 내용까지 추가하였습니다.
      HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그
      https://techblog.woowahan.com/2664/
      HikariCP Dead lock에서 벗어나기 (이론편) | 우아한형제들 기술블로그
      HikariCP Dead lock에서 벗어나기 (실전편) | 우아한형제들 기술블로그
      1부 HikariCP Dead lock에서 벗어나기 (이론편)은 잘 보셨나요? 2부 HikariCP Dead lock에서 벗어나기 (실전편)에서는 실제 장애 사례를 기반으로 장애 원인을 설명하고 해결 사례를 공유하고자 합니다. 그럼 시작하도록 하겠습니다! 사실, 예제가 실제 상황이었습니다.
      HikariCP Dead lock에서 벗어나기 (실전편) | 우아한형제들 기술블로그
      https://techblog.woowahan.com/2663/
      HikariCP Dead lock에서 벗어나기 (실전편) | 우아한형제들 기술블로그
  • 윈도우 환경에서 에러 java.net.BindException: Address already in use: connect가 나는 문제
    • Jmeter 오류(java.net.BindException: Address already in use: connect)
      local 에서 spring boot application 2개를 띄웠고 A application 으로 들어온 요청을 가공 후 B application 으로 보낸뒤 응답을 받는(client -> A -> B -> A -> client) 테스트 중 Jmeter 에서 300 thread 로 테스트 시 아래와 같은 오류 ...
      Jmeter 오류(java.net.BindException: Address already in use: connect)
      https://boneman.tistory.com/entry/Jmeter-%EC%98%A4%EB%A5%98javanetBindException-Address-already-in-use-connect
      Jmeter 오류(java.net.BindException: Address already in use: connect)
       

성능테스트 List

  • 참고 한명이 한번에 100의 요청을 날리는 것과 100명이 동시에 1번씩 요청을 날리는 것은 동일
 

예약 가능시간 조회

 
〽️
성능테스트 결과
 
 

예약률에 따른 최대 TPS 결과 (기준을 User or 횟수)

ㅤ
0%
25%
50%
75%
100%
동적
1464.4
576.0
356.6
255.8
201.7
정적
139.7
144.0
148.9
155.1
161.4
 
 
  • 동적 계산 조회 테스트
    • 스레드 수 → 40,000
    • ramp up → 600
    • loop → 4
    • 평균 기대 TPS → 40,000/150(266.x)
    • 실제 평균 TPS 250~270
 
  • 로컬환경정리하고 테스트
  • 환경을 똑같게 만들고 비교
  • 길게 두고 테스트