๋ฌธ์ ์ํฉ
1000๋ช ์ ๋ ๋๋ ์ ์ ์ ๋ฉค๋ฒ ๋ฆฌ์คํธ ์กฐํํ๋ ๊ณผ์ ์์ ์ฟผ๋ฆฌ๊ฐ ์ด 2๋ฒ ๋๊ฐ์ผํ๋ ์ํฉ์ด ๋ฐ์ํ์ด์.
1. ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ์ ์ฒด ์กฐํํ๋ ์ฟผ๋ฆฌ + ํํฐ๋ง ํฌํจ
2. ํํฐ๋ง์ ํฌํจ๋๋ ๋ฉค๋ฒ๋ฅผ countํ๋ ์ฟผ๋ฆฌ
๋ฐ์ดํฐ๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ์, ์ฟผ๋ฆฌ ์๋๊ฐ ๋์ด๋๋ ๊ฒ์ ๋ถ๋ด์ ๋๋ผ๊ฒ ๋์ด์ jMeter๋ก ๊ฒ์ ์๋ ํ ์คํธ๋ฅผ ์งํํ๊ธฐ๋ก ํ์์ต๋๋ค.
jMeter ์ฌ์ฉ๋ฐฉ๋ฒ
๋ค์ด
https://jmeter.apache.org/download_jmeter.cgi
ํฐ๋ฏธ๋์์ ๋ค์ด๋ฐ์ ์์น๋ก ๊ฐ์ ์คํ!
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
'Server๐งค > QueryDsl' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Querydsl] ๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ ๊ตฌํ ( Offset vs No Offest ) (0) | 2023.06.28 |
---|---|
[QueryDsl] ํ์ด์ง๋ค์ด์ ์ฒ๋ฆฌ (Offset based, Cursor based) (0) | 2023.06.04 |