Server๐Ÿงค/QueryDsl

[Querydsl] Jmeter๋ฅผ์ด์šฉํ•œ ์†๋„ ํ…Œ์ŠคํŠธ / Entity ์กฐํšŒ์™€ id ์กฐํšŒ ์„ฑ๋Šฅ ์ฐจ์ด

yujindonut 2023. 5. 9. 13:27
728x90

๋ฌธ์ œ ์ƒํ™ฉ

1000๋ช… ์ •๋„ ๋˜๋Š” ์œ ์ €์˜ ๋ฉค๋ฒ„ ๋ฆฌ์ŠคํŠธ ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์—์„œ ์ฟผ๋ฆฌ๊ฐ€ ์ด 2๋ฒˆ ๋‚˜๊ฐ€์•ผํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์–ด์š”.

 

1. ๋ฉค๋ฒ„ ์ •๋ณด๋ฅผ ์ „์ฒด ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ + ํ•„ํ„ฐ๋ง ํฌํ•จ

2. ํ•„ํ„ฐ๋ง์— ํฌํ•จ๋˜๋Š” ๋ฉค๋ฒ„๋ฅผ countํ•˜๋Š” ์ฟผ๋ฆฌ

 

๋ฐ์ดํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ์„œ, ์ฟผ๋ฆฌ ์†๋„๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์— ๋ถ€๋‹ด์„ ๋А๋ผ๊ฒŒ ๋˜์–ด์„œ  jMeter๋กœ ๊ฒ€์ƒ‰ ์†๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


jMeter ์‚ฌ์šฉ๋ฐฉ๋ฒ•

๋‹ค์šด

https://jmeter.apache.org/download_jmeter.cgi

 

Apache JMeter - Download Apache JMeter

Download Apache JMeter We recommend you use a mirror to download our release builds, but you must verify the integrity of the downloaded files using signatures downloaded from our main distribution directories. Recent releases (48 hours) may not yet be ava

jmeter.apache.org

ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์šด๋ฐ›์€ ์œ„์น˜๋กœ ๊ฐ€์„œ ์‹คํ–‰!

 

Thread ๊ทธ๋ฃน์„ ๋งŒ๋“ค์–ด์„œ ๋ถ€ํ•˜๋ฅผ ๋งŒ๋“ค Thread ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด์š”.

 

๋ถ€ํ•˜ ์ผ์œผํ‚ฌ http request ์ƒ์„ฑ ๋ฐ ์ž‘์„ฑํ•ด์ค˜์š”

 

Aggregate Graph๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

 

์ €๋Š” ์ด 100๋ช…์˜ ์œ ์ €๊ฐ€ 1์ดˆ์•ˆ์— ๋ฐ˜๋ณต์ ์œผ๋กœ 5๋ฒˆ API ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

 


๊ฒฐ๊ณผ

์šฐ์„  ์•„๋ฌด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„๋•Œ API ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด๋ฉด ํ‰๊ท ์ ์œผ๋กœ 192ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

 

์ž์ž ์ด์ œ ๋กœ์ปฌ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ๋ถ€ํ•˜๋ฅผ ๊ฑธ์–ด๋ดค์–ด์š”!

 

์ฒ˜์Œ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

SelectFrom์„ ํ†ตํ•ด member entity ์—์„œ member entity ์ „์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

member entity์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ๊ฒ€์ƒ‰๋˜์–ด ์ฟผ๋ฆฌ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

ํ‰๊ท ์ ์œผ๋กœ 278ms๊ฐ€ ๋‚˜์˜ค๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.


select count๋ฅผ ์‹คํ–‰ํ• ๋•Œ member.id๋กœ ๊ฒ€์ƒ‰์„ ํ•˜๊ฒŒ ํ–ˆ์–ด์š”. entity๋กœ ๊ฒ€์ƒ‰ํ• ๋•Œ๋ณด๋‹ค ์ฟผ๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์ ๊ฒŒ ๋‚˜๊ฐ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

ํ‰๊ท  ๊ฒ€์ƒ‰ ์†๋„๋Š” 276ms๊ฐ€ ๋‚˜์™”์–ด์š”.

 

๋ฐ์ดํ„ฐ๊ฐ€ 50๊ฐœ ์ดํ•˜๋ผ์„œ, 2Ms์†๋„์ฐจ์ด๋งŒ ๋‚˜๋Š”๊ตฐ์š”!


๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ

์กฐ๊ธˆ ๋” ์†๋„์ฐจ์ด๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ

500๊ฐœ์˜ ์œ ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์—ˆ์–ด์š”.

joinํ•˜๋Š” member.activities ํ…Œ์ด๋ธ”์—๋Š” 700๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋ณด์•˜์–ด์š”!

 

์‹คํ–‰๋˜๋Š” ๊ฐœ์ˆ˜(500๋ฒˆ)๋ฅผ ๊ฐ™๊ฒŒ ๋งž์ถ”๊ณ  ์‹คํ–‰์‹œ์ผœ๋ณด์•˜์–ด์š”.

 

member entity ์ „์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ

90 % : 10% ์ค‘์— ๋А๋ฆฐ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฐ’

95 % : 5% ์ค‘์— ๋А๋ฆฐ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฐ’

99 % : 1% ์ค‘์— ๋А๋ฆฐ ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฐ’

 

ํ‰๊ท  ์ด 14583ms

 

select.(member.id).from(member) ์ฟผ๋ฆฌ

ํ‰๊ท  ์ด 11488ms


 

๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ๊นŒ ํ™•์—ฐํ•œ ์ฐจ์ด๊ฐ€ ๋ˆˆ์— ๋ณด์ž…๋‹ˆ๋‹ค!

 

์™œ Entity๋ž‘ ํŠน์ • ์ปฌ๋Ÿผ ์กฐํšŒ๋ž‘ ์ด๋ ‡๊ฒŒ ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚˜๋Š”๊ฑธ๊นŒ์š”?

Entity ์กฐํšŒ์‹œ, Hibernate ์บ์‹œ์— ๋ณต์‚ฌ๋ณธ ์ €์žฅ, ๋ถˆํ•„์š”ํ•œ ์ปฌ๋Ÿผ ์กฐํšŒ, OneToOne์—์„œ์˜ N + 1 ์ฟผ๋ฆฌ ๋“ฑ ๋‹จ์ˆœ ์กฐํšŒ ๊ธฐ๋Šฅ์—์„œ ์„ฑ๋Šฅ ์ด์Šˆ ์š”์†Œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

 

์œ„์˜ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณธ๋‹ค๋ฉด, member ์กฐํšŒ๋ฅผ ํ•˜๋ฉด์„œ member.activity์˜ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๊ฑด๋งˆ๋‹ค ์กฐํšŒ๊ฐ€๋˜์–ด N + 1 ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ํ•˜๊ฒŒ ๋  ์‹œ์—๋Š” id์™€ entity์˜ ์กฐํšŒํ• ๋•Œ๋Š” 6๋ฐฐ์˜ ์‹œ๊ฐ„์ฐจ์ด๊ฐ€ ๋‚˜๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•ด์š”.

 

์กฐํšŒ ์ปฌ๋Ÿผ์„ ์ค„์ด๋Š” ๊ฒƒ์ด ๋จธ๋ฆฟ์†์œผ๋กœ ์ƒ์ƒ๋งŒ ํ•ด๋ณด์•„๋„ ์†๋„๊ฐ€ ์ค„์–ด๋“ค ๊ฒƒ ๊ฐ™์•„์š”.

๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ , ๊ณ ๊ฐ•๋„ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ, DTO๋ฅผ ํ†ตํ•ด ์กฐํšŒํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์ปฌ๋Ÿผ์œผ๋กœ๋งŒ ์กฐํšŒํ•˜๋ฉด ๋Œ€๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์„ฑ๋Šฅ์ƒ์œผ๋กœ ์ด์ ์ด ๋งŽ๊ฒ ์ฃ ..!

 

JPA์˜ ์ด์ ์ธ entity ์กฐํšŒํ• ๋•Œ, ์•„๋ฌด ์ƒ๊ฐ์—†์ด select ์ ˆ์— entity๋ฅผ ๋„ฃ๊ณค ํ–ˆ๋Š”๋ฐ,

์˜์‹์ ์œผ๋กœ select ์ปฌ๋Ÿผ์—๋Š” entity๋ฅผ ์ž์ œํ•˜๊ณ  ์กฐํšŒ์ปฌ๋Ÿผ์„ ์ตœ์†Œํ™”ํ•˜๋„๋ก ํ•ด์•ผ๊ฒ ์–ด์š”!

 

 

์ €ํฌ ์ธ์ƒ์—์„œ 3,095ms ์ด๋ž€ ์‹œ๊ฐ„์ด ์–ผ๋งˆ๋‚˜ ์†Œ์ค‘ํ•œ์ง€ ์•„์‹œ์ฃ ?
์ €ํฌ๋Š” ๋กœ๋”ฉ ์†๋„๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๋А๋ ค์ง€๋ฉด ์งœ์ฆ์ด ๋‚˜๊ธฐ๋„ํ•˜๊ณ  ๋‚˜๊ฐ€๋ฒ„๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

์•”์ƒ๊ฐ์—†์ด entity๋ฅผ ์ „์ฒด ์กฐํšŒํ•˜๊ธฐ๋ณด๋‹ค, id๋‚˜ ์กฐํšŒ์ปฌ๋Ÿผ์„ ์ตœ์†Œํ™”ํ•ด์„œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์„ ์˜์‹์ ์œผ๋กœ ๊ฐœ์„ ํ•ด๋ณด์ž

 

 


๊ฒฐ๋ก 

log๋ฅผ ์‚ฌ์šฉํ•ด์„œ currentImeMillis()๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์ฐจ์ด๋ฅผ ๊ตฌํ–ˆ๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋„ ๋งŽ์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ, ๋ฐ˜๋ณต์ ์œผ๋กœ ๋Œ๋ ธ์„๋•Œ ๊ฐ’์˜ ์ฐจ์ด๊ฐ€ ํฌ์ง€ ์•Š์•„์„œ ๋‹ต๋‹ตํ•จ์„ ๋А๊ผˆ์–ด์š”. 

long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
System.out.println("end - start = " + (end - start));

jmeter๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋ฒ„์— ๋ถ€ํ•˜๋ฅผ ๋ณด๋‚ด์„œ ์†๋„์ธก์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ณ„์‚ฐ๋„ ํ•ด์ฃผ๊ณ  ๊ฐ€์‹œ์ ์œผ๋กœ ํ‘œ๋ฅผ ๋ณด์—ฌ์ฃผ๋‹ˆ๊นŒ ํŽธํ•˜๊ณ  ์žฌ๋ฐŒ์—ˆ๋˜ ๊ฒฝํ—˜์ด์—์š”!

์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

 

 

 

Reference

๋”๋ณด๊ธฐ

https://velog.io/@ehdrms2034/%EC%84%B1%EB%8A%A5-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8F%84%EA%B5%AC-Apache-Jmeter-%EC%84%A4%EC%B9%98%EB%B6%80%ED%84%B0-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%82%AC%EC%9A%A9%EA%B9%8C%EC%A7%80

 

[์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋„๊ตฌ] Apache Jmeter ์„ค์น˜๋ถ€ํ„ฐ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๊นŒ์ง€

์˜ค๋Š˜์€ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ ๋„๊ตฌ๋กœ ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๋Š” Apache Jmeter์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ผ๊ณ  ํ• 

velog.io

https://www.youtube.com/watch?v=zMAX7g6rO_Y

https://jaehoney.tistory.com/212

 

QueryDSL - Select ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค! (+ JPQL ๊ด€๋ จ ์ด์Šˆ)

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ "[์šฐ์•„์ฝ˜2020] ์ˆ˜์‹ญ์–ต๊ฑด์—์„œ QUERYDSL ์‚ฌ์šฉํ•˜๊ธฐ" ๋ผ๋Š” ์˜์ƒ์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜์ƒ์€ ์•„๋ž˜ Reference์—์„œ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - https://www.youtube.com/watch?v=zMAX7g6rO_Y exist ๋ฉ”์†Œ

jaehoney.tistory.com

 

728x90