JMeter์ Locust๋ฅผ ์ฌ์ฉํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ์๋๋ฆฌ์ค ๊ธฐ๋ฐ ๋ถํ ํ ์คํธ๋ฅผ ์ค์ตํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตยทํด์ํ๊ธฐ ์ํ ๋ฉ ์ ์ฅ์์ ๋๋ค.
์ด ์ ์ฅ์๋ ๋จ์ํ ํด ์คํ๋ฒ์ ๋์ดํ๋ ๊ฒ์ด ์๋๋ผ, ์๋ ์ง๋ฌธ์ ๋ตํ ์ ์๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ์ด๋ค ์ฌ์ฉ์ ํ๋ฆ์ ํ ์คํธํ๋๊ฐ?
- ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ถํ๋ฅผ ์ฆ๊ฐ์์ผฐ๋๊ฐ?
- ์ด๋ค ์งํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณ๋ชฉ์ ํด์ํ๋๊ฐ?
- JMeter์ Locust๋ ๊ฐ๊ฐ ์ด๋ค ์ฅ๋จ์ ์ด ์์๋๊ฐ?
์ด ํ๋ก์ ํธ๋ ์๊ฐ์ ์ฒญ ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ผ๋ก ๋ก๊ทธ์ธ ํ ๊ฐ์ ๋ชฉ๋ก๊ณผ ์์ธ ํ์ด์ง๋ฅผ ํ์ํ๋ ํ๋ฆ์ ๋ถํ ํ ์คํธํ๋ ์ค์ต ํ๋ก์ ํธ์ ๋๋ค.
ํ ์คํธ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊ฐ์ง ๊ตฌํ์ฒด๋ฅผ ํฌํจํฉ๋๋ค.
- Flask ๊ธฐ๋ฐ ์์ ์ฑ: Course_registration_flask/app.py
- Spring Boot ๊ธฐ๋ฐ ์์ ์ฑ: Course_registration_java/src/main/java/com/example/demo/controller/WebController.java
ํ ์คํธ ๋๊ตฌ๋ ๋ค์ ๋ ๊ฐ์ง์ ๋๋ค.
- JMeter ์๋๋ฆฌ์ค: jmeter/scenario/overload.jmx
- Locust ์๋๋ฆฌ์ค: locust/scenario/locustfile.py
์ด ํ๋ก์ ํธ์ ๋ชฉ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ก๊ทธ์ธ ๊ธฐ๋ฐ ์น ์๋น์ค์ ๋ํ ์ฌ์ฉ์ ํ๋ฆ์ ๋ถํ ์ํฉ์์ ์ฌํ
- ๋์ ์ฌ์ฉ์ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์๋ต์๊ฐ, ์ฒ๋ฆฌ๋, ์ค๋ฅ์จ ๋ณํ๋ฅผ ๊ด์ฐฐ
- JMeter์ Locust์ ์๋๋ฆฌ์ค ๊ตฌ์ฑ ๋ฐฉ์ ๋ฐ ๊ฒฐ๊ณผ ์ฐ์ถ ๋ฐฉ์ ๋น๊ต
- ๋จ์ ์คํ ๊ฒฐ๊ณผ ๋์ด์ด ์๋๋ผ โ๋ฌด์์ ๊ฒ์ฆํ๊ณ ์ด๋ป๊ฒ ํด์ํ๋์งโ๋ฅผ ์ค๋ช ๊ฐ๋ฅํ ํํ๋ก ์ ๋ฆฌ
| ๊ตฌ๋ถ | ๋๊ตฌ | ์ฉ๋ |
|---|---|---|
| ๋ถํ ํ ์คํธ | JMeter | GUI ๊ธฐ๋ฐ ํ ์คํธ ํ๋ ์์ฑ, ๋จ๊ณ์ ์ฌ์ฉ์ ์ฆ๊ฐ, ๋ฆฌํฌํธ ํ์ธ |
| ๋ถํ ํ ์คํธ | Locust | Python ์ฝ๋ ๊ธฐ๋ฐ ์ฌ์ฉ์ ํ๋ ์ ์, ํค๋๋ฆฌ์ค/์น UI ์คํ |
| ๋์ ์ ํ๋ฆฌ์ผ์ด์ | Flask | ๊ฒฝ๋ ์์ ์ฑ์ผ๋ก ๋น ๋ฅธ ์๋๋ฆฌ์ค ๊ฒ์ฆ |
| ๋์ ์ ํ๋ฆฌ์ผ์ด์ | Spring Boot | ๋ค๋ฅธ ๋ฐํ์ ํ๊ฒฝ์์ ๋์ผ ํ๋ฆ ํ ์คํธ |
| ๋ฐ์ดํฐ | CSV | ํ ์คํธ ๊ณ์ ๋ฐ์ดํฐ ๊ณต๊ธ |
| ๊ฒฐ๊ณผ ํ์ฒ๋ฆฌ | pandas, matplotlib, seaborn | Locust CSV ๊ฒฐ๊ณผ๋ฅผ ์๊ฐํ |
CSV Data Set ConfigHTTP Request DefaultsStepping Thread Groupํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฐ ๋จ๊ณ์ ์ฌ์ฉ์ ์ฆ๊ฐWeighted Switch Controller๊ธฐ๋ฐ ์๋๋ฆฌ์ค ์ ์ด
HttpUseron_start()๊ธฐ๋ฐ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ@task๊ธฐ๋ฐ ์ฌ์ฉ์ ํ๋ ๊ฐ์ค์น ์ค์ - ํค๋๋ฆฌ์ค ์คํ ๋ฐ CSV ๊ฒฐ๊ณผ ์ ์ฅ
ํ์ฌ ์ ์ฅ์์ ํต์ฌ ์๋๋ฆฌ์ค๋ โ์๊ฐ์ ์ฒญ ์๋น์ค ํ์ ํ๋ฆโ์ ๋๋ค.
- ๋ก๊ทธ์ธ ์์ฒญ
- ๊ฐ์ ๋ชฉ๋ก ์กฐํ
- ๊ฐ์ ์์ธ ํ์ด์ง ์กฐํ
- ๋ก๊ทธ์์
| ๋จ๊ณ | ๋ฉ์๋ | ๊ฒฝ๋ก | ์ค๋ช |
|---|---|---|---|
| 1 | POST | /login |
์ฌ์ฉ์ ์ธ์ฆ |
| 2 | GET | /course |
๊ฐ์ ๋ชฉ๋ก ์กฐํ |
| 3 | GET | /course/1 ~ /course/4 |
๊ฐ์ ์์ธ ํ์ด์ง ๋ฐ๋ณต ์กฐํ |
| 4 | GET ๋๋ POST | /logout |
์ธ์ ์ข ๋ฃ |
- CSV ํ์ผ๋ก ์ฌ์ฉ์ ๊ณ์ ๋ก๋
- ๋จ๊ณ์ ์ผ๋ก ์ฌ์ฉ์๋ฅผ ์ฆ๊ฐ์ํค๋ ํํ์ ์ค๋ ๋ ๊ทธ๋ฃน ์ฌ์ฉ
- ์ต๋ 100๋ช ์์ค๊น์ง ์ ์ง ์ฆ๊ฐํ๋๋ก ์ค์
- ๋ํ ์น ํ๋ฆ์ ์ฐ์ ํธ์ถํ๋ ๊ตฌ์กฐ
- ์ฌ์ฉ์ ์์ ์ ๋ก๊ทธ์ธ ์ํ
view_courses,view_course_details,logout์์ ์ ๊ฐ์ค์น ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๋ณต- ํค๋๋ฆฌ์ค ์คํฌ๋ฆฝํธ์์๋ step-load ์ต์ ์ผ๋ก ์ฌ์ฉ์ ์๋ฅผ ์ ์ง ์ฆ๊ฐ
์ด ์ ์ฅ์์์ ํต์ฌ์ ์ผ๋ก ๋ด์ผ ํ๋ ์งํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
| ์งํ | ์๋ฏธ | ํด์ ํฌ์ธํธ |
|---|---|---|
| TPS / Throughput / Requests per second | ์ด๋น ์ฒ๋ฆฌ ์์ฒญ ์ | ๋ถํ๊ฐ ์ฆ๊ฐํด๋ ์ฒ๋ฆฌ๋์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋์ง ํ์ธ |
| Average Response Time | ํ๊ท ์๋ต์๊ฐ | ์ ์ฒด์ ์ธ ์ฒด๊ฐ ์ฑ๋ฅ ์์ค ํ์ |
| Median Response Time | ์ค์๊ฐ ์๋ต์๊ฐ | ์ผ๋ถ ์ด์์น๋ณด๋ค ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ ํ์ ์ ์ ๋ฆฌ |
| P90 / P95 / P99 | ์์ ๋ฐฑ๋ถ์ ์๋ต์๊ฐ | ๋๋ฆฐ ์์ฒญ์ด ์ผ๋ง๋ ์์ฃผ ๋ฐ์ํ๋์ง ํ์ธ |
| Failure Rate / Error Count | ์ค๋ฅ์จ, ์คํจ ๊ฑด์ | ์๊ณ ๋ถํ ๊ตฌ๊ฐ ํ์ง |
| Concurrent Users | ๋์ ์ฌ์ฉ์ ์ | ์ด๋ ์์ค๋ถํฐ ์ฑ๋ฅ ์ ํ๊ฐ ์์๋๋์ง ํ๋จ |
ํนํ ์๋ ์ธ ๊ฐ์ง ์งํ๋ฅผ ํจ๊ป ๋ณด๋ฉด ํด์์ ๋์์ด ๋ฉ๋๋ค.
- ์ฌ์ฉ์ ์ ๋๋น TPS
- ์ฌ์ฉ์ ์ ๋๋น P95 ์๋ต์๊ฐ
- ์ฌ์ฉ์ ์ ๋๋น ์ค๋ฅ์จ
cd Course_registration_flask
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python app.py๊ธฐ๋ณธ ํฌํธ๋ 5001์
๋๋ค.
cd Course_registration_java
mvn spring-boot:run๊ธฐ๋ณธ ํฌํธ๋ 8082์
๋๋ค.
- JMeter ์ค์น
- jmeter/scenario/overload.jmx ๋ก๋
base_url,port, CSV ๊ฒฝ๋ก ๋ฑ ๋ณ์ ๊ฐ์ ํ๊ฒฝ์ ๋ง๊ฒ ์์ - ์คํ ํ Summary Report ๋๋ ๊ฒฐ๊ณผ ๋ฆฌ์ค๋ ํ์ธ
cd jmeter
jmeter -n -t scenario/overload.jmx -l result/result.jtl -e -o result/report์ฐธ๊ณ : ํ์ฌ JMeter ์๋๋ฆฌ์ค๋ ํ๋ฌ๊ทธ์ธ ์์กด ์์๊ฐ ์์ผ๋ฏ๋ก
Custom Thread Groups,bzm - Weighted Switch Controller๊ณ์ด ํ๋ฌ๊ทธ์ธ์ด ํ์ํ ์ ์์ต๋๋ค.
cd locust
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtcd locust
locust -f scenario/locustfile.py \
--headless \
--host=http://localhost:5001 \
-u 20 -r 5 -t 1m \
--csv=result/testcd locust
bash locust.shcd locust
bash UI_mode_locust.sh์คํ ํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8089๋ก ์ ์ํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ๋ โ์์น๊ฐ ๋ฎ๋ค/๋๋คโ๋ณด๋ค โ๋ถํ ์ฆ๊ฐ์ ๋ฐ๋ผ ์ด๋ค ํจํด์ด ๋ํ๋๋๊ฐโ๋ฅผ ์ค์ฌ์ผ๋ก ํด์ํด์ผ ํฉ๋๋ค.
- ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ์๋ค์ด๊ณ ๋ ์์ง๋ง ์ฒ๋ฆฌ ์ง์ฐ์ด ๋์ ๋๋ ์ํ์ผ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง, ์ธ์ ์ฒ๋ฆฌ, ํ ํ๋ฆฟ ๋ ๋๋ง, DB I/O ๋ณ๋ชฉ์ ์์ฌํ ์ ์์ต๋๋ค.
- ์๋ฒ ์์ ํ๊ณ, ์ธ์ ์ฒ๋ฆฌ ๋ฌธ์ , ํ์์์ ์ค์ ๋ถ์กฑ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
- ๋จ์ ํ๊ท ์๋ต์๊ฐ๋ณด๋ค ๋จผ์ ์ค๋ฅ์จ์ ํ์ธํด์ผ ํฉ๋๋ค.
- ์ผ๋ถ ์์ฒญ๋ง ๋น์ ์์ ์ผ๋ก ๋๋ฆฐ tail latency ๋ฌธ์ ์ผ ์ ์์ต๋๋ค.
- ํ๊ท ๊ฐ๋ณด๋ค ๋ฐฑ๋ถ์ ์งํ๋ฅผ ํจ๊ป ๋ณด๋ ํธ์ด ์ค์ ์ง์ฐ ๊ตฌ๊ฐ์ ์ดํดํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค.
/course๋ณด๋ค/course/{id}๊ฐ ๋๋ฆฌ๋ค๋ฉด ์์ธ ์กฐํ ๋ก์ง ๋๋ ํ ํ๋ฆฟ/๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋น์ฉ์ด ๋ ํฌ๋ค๋ ์๋ฏธ์ผ ์ ์์ต๋๋ค.- URL๋ณ ๋น๊ตํ๋ฅผ ๋ง๋ค์ด ๋ณ๋ชฉ ํ๋ณด๋ฅผ ์ ์ํ๋ฉด ๋ฌธ์ ์์ฑ๋๊ฐ ๋์์ง๋๋ค.
ํ์ฌ ์ ์ฅ์์๋ ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ ํ์ผ ์์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- Locust CSV ๊ฒฐ๊ณผ: locust/result/test_stats.csv
- Locust ์ค๋ฅ/์คํจ ๊ฒฐ๊ณผ: locust/result/test_exceptions.csv, locust/result/test_failures.csv
- Locust ๊ทธ๋ํ ์ด๋ฏธ์ง: locust/result/locust_graph.png
- JMeter ๊ฒฐ๊ณผ ๋๋ ํฐ๋ฆฌ: jmeter/result
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ ํ์์ผ๋ก ์ ๋ฆฌํ๋ฉด ๋น๊ต์ ํด์์ด ์ฌ์์ง๋๋ค.
| ์กฐ๊ฑด | ์ต๋ ๋์ ์ฌ์ฉ์ | TPS | Avg ์๋ต์๊ฐ | P95 | ์ค๋ฅ์จ | ํด์ |
|---|---|---|---|---|---|---|
| Baseline | 10 | - | - | - | - | ๊ธฐ์ค ์ฑ๋ฅ |
| Load | 50 | - | - | - | - | ์์ ๊ตฌ๊ฐ ์ฌ๋ถ ํ์ธ |
| Stress | 100 | - | - | - | - | ํ๊ณ ๊ตฌ๊ฐ ํ์ |
์ด ์ ์ฅ์๋ ํ์ต ๋ฐ ๋น๊ต ๋ชฉ์ ์ ๋ฉ ํ๊ฒฝ์ด๋ฏ๋ก, ์ค์ ์ด์ ํ๊ฒฝ ์ฑ๋ฅ ๊ฒ์ฆ์ผ๋ก ๋ฐ๋ก ์ผ๋ฐํํ๊ธฐ์๋ ํ๊ณ๊ฐ ์์ต๋๋ค.
- ํ ์คํธ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋จ์ ํ ํ๋ฆฟ ๋ ๋๋ง ์ค์ฌ์ด๋ผ ์ค์ ์๋น์ค ๋ณ๋ชฉ์ ์ถฉ๋ถํ ์ฌํํ์ง ๋ชปํจ
- ๋ฐ์ดํฐ์ ์ด ์๊ณ ์ฌ์ฉ์ ์๊ฐ ์ ํ์ ์ด์ด์ ์บ์/์ธ์ ๊ฒฝํฉ ์ํฉ ์ฌํ์ด ์ฝํจ
- ์์คํ ๋ฆฌ์์ค(CPU, ๋ฉ๋ชจ๋ฆฌ, GC, DB ์ฐ๊ฒฐ ์)์์ ์๊ด๋ถ์์ด ํฌํจ๋์ด ์์ง ์์
- ๊ฒฐ๊ณผ ์์ฝ์ด ํด ๊ธฐ๋ณธ ์ถ๋ ฅ ์ค์ฌ์ด๋ผ ์์ฌ๊ฒฐ์ ์ฉ ๋น๊ต ์๋ฃ๋ก๋ ๋ถ์กฑํจ
-
์๋๋ฆฌ์ค ๊ณ ๋ํ
- ๋ก๊ทธ์ธ ์ฑ๊ณต/์คํจ ๋ถ๋ฆฌ
- ํน์ ํ์ด์ง ์ง์ค ์กฐํ ์๋๋ฆฌ์ค
- ์ฝ๊ธฐ/์ฐ๊ธฐ ํผํฉ ์๋๋ฆฌ์ค ์ถ๊ฐ
-
๊ด์ธก์ฑ ๊ฐํ
- ์๋ฒ CPU, ๋ฉ๋ชจ๋ฆฌ, GC, ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ์ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ํจ๊ป ์์ง
- ์๋ต์๊ฐ ๊ธ์ฆ ์์ ๊ณผ ์ธํ๋ผ ์งํ๋ฅผ ์ฐ๊ฒฐํด ๋ถ์
-
๊ฒฐ๊ณผ ๋น๊ต ์ฒด๊ณํ
- JMeter vs Locust ๋น๊ตํ ์์ฑ
- Flask vs Spring Boot ๋น๊ต ์คํ
- ๋ถํ ๋จ๊ณ๋ณ Baseline / Load / Stress ๊ฒฐ๊ณผ ํ์คํ
-
์ฌํ์ฑ ๊ฐ์
- ํ๊ฒฝ ๋ณ์ ๊ธฐ๋ฐ ์ค์ ํต์ผ
- ๊ฒฐ๊ณผ ํ์ผ ๋ค์ด๋ฐ ๊ท์น ์ ๋ฆฌ
- ํ ์คํธ ์คํ ์ ์ ์กฐ๊ฑด๊ณผ ํ๋ฌ๊ทธ์ธ ๋ชฉ๋ก ๋ช ๋ฌธํ
.
โโโ Course_registration_flask/ # Flask ๊ธฐ๋ฐ ํ
์คํธ ๋์ ์ฑ
โโโ Course_registration_java/ # Spring Boot ๊ธฐ๋ฐ ํ
์คํธ ๋์ ์ฑ
โโโ jmeter/ # JMeter ์๋๋ฆฌ์ค, ๋ฐ์ดํฐ์
, ๊ฒฐ๊ณผ
โโโ locust/ # Locust ์๋๋ฆฌ์ค, ์คํ ์คํฌ๋ฆฝํธ, ๊ฒฐ๊ณผ
โโโ git_upload/ # README ์ด๋ฏธ์ง ๋ฆฌ์์ค
โโโ README.md
Course_registration_flask/: ๋น ๋ฅด๊ฒ ์คํ ๊ฐ๋ฅํ ๊ฒฝ๋ ํ ์คํธ ๋์Course_registration_java/: ๋ค๋ฅธ ๋ฐํ์์์ ๋์ผ ํ๋ฆ ๊ฒ์ฆ์ฉ ๋์jmeter/: GUI ์ค์ฌ ์ฑ๋ฅ ํ ์คํธ ์์ฐlocust/: ์ฝ๋ ๊ธฐ๋ฐ ์ฑ๋ฅ ํ ์คํธ ์์ฐ