How to Avoid N+1 Queries
JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฃผ ๋ง๋๊ฒ ๋๋ N+1 Query์ ๋ํด ์์๋ณด์์
References: jojoldu.tistory.com
What are N+1 queries?
ํ์ ์ํฐํฐ๋ค์ ์ฒซ ์ฟผ๋ฆฌ ์คํ์ ํ ๋ฒ์ ๊ฐ์ ธ์ค์ง ์๊ณ , Lazy Loading์ผ๋ก ํ์ํ ๊ณณ์์ ์ฌ์ฉ๋์ด ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋ ๋ฐ์ํ๋ ๋ฌธ์
How to Avoid N+1 Queries?
1. Join Fetch
์กฐํ ์ ๋ฐ๋ก ๊ฐ์ ธ์ค๊ณ ์ถ์ Entity Field๋ฅผ ์ง์ ํ๋ ๊ฒ
ex)
ํ์ Entity๊น์ง ํ ๋ฒ์ ๊ฐ์ ธ์์ผ ํ ๋๋ ์ฌ์ฉํ ์ ์๋ค.
ex)
but, ์ด ๋ฐฉ๋ฒ์ ๋ถํ์ํ ์ฟผ๋ฆฌ๋ฌธ์ด ์ถ๊ฐ๋๋ ๋จ์ ์ด ์๋ค
์ด field๋ Eager ์กฐํ, ์ field๋ Lazy ์กฐํ ๋ฅผ ํด์ผํ๋ค
๊น์ง query์์ ํํํ๋ ๊ฒ์ ๋ถํ์ํ๋ค๊ณ ๋๋ ์ ์๋ค.
๊ทธ๋ด ๋, ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
2. @EntityGraph
@EntityGraph
์ attributePath
์ query ์ํ ์ ๋ฐ๋ก ๊ฐ์ ธ์ฌ field๋ช
์ ์ง์ ํ๋ฉด, Lazy๊ฐ ์๋ Eager ์กฐํ๋ก ๊ฐ์ ธ์ค๊ฒ ๋๋ค
ex)
์์ ๊ฐ์ด attributePath
๋ฅผ ์ง์ ํ๋ฉด, ์๋ณธ ์ฟผ๋ฆฌ (SELECT a FROM School a)์ ์์ ์์ด Eager/Lazy field๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
์ถ๊ฐ๋ก Tearcher๊น์ง ํ ๋ฒ์ ๊ฐ์ ธ์ค๋ query๋ ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค
์ฃผ์ํ ์
JoinFetch
๋ Inner Join, Entity Graph
๋ Outer Join ๋ผ๋ ์ฐจ์ด์ ์ด ์์์ ์ ์ํ์. ๊ณตํต์ ์ผ๋ก ์นดํ
์์ ๊ณฑ(Cartesian Product) ์ด ๋ฐ์ํ์ฌ, Subject
์ ๋งํผ School
์ด ์ค๋ณต ๋ฐ์ํ๊ฒ ๋๋ค
ํด๊ฒฐ ๋ฐฉ์
Solution 1
1:N field์ type์
Set
์ผ๋ก ์ ์ธํ๊ธฐSet
์ ์ค๋ณต์ ํ์ฉํ์ง ์๋ ์๋ฃ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์, ์ค๋ณต ๋ฑ๋ก์ด ๋์ง ์๋๋ค
ex)
Set
์ ์์๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์, LinkedHashSet
์ ์ฌ์ฉํ์ฌ ์์๋ฅผ ๋ณด์ฅํ๋ค
Solution 2
distinct
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ
์ด ๋ถ๋ถ์ @Query
์์ ์ ์ฉํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, join fetch
, @EntityGraph
๋ ๋์ผํ๋ค
ex)
Last updated
Was this helpful?