songining
Published 2022. 8. 21. 15:52
FetchJoin ๊ณผ EntityGraph BACKEND/Spring

์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด ์ง€์—ฐ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •์„ ํ•ด์ฃผ๋ฉด ์ผ๋ฐ˜์ ์ธ ์กฐํšŒ ์ฟผ๋ฆฌ์—์„œ๋Š” ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์กฐํšŒํ•ด์˜ค์ง€ ์•Š๊ณ  ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋Š” ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋กœ ์„ค์ •์ด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐ’์— ์ ‘๊ทผํ•ด์•ผํ•  ๋•Œ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ์ฟผ๋ฆฌ๊ฐ€ ํ•œ๋ฒˆ์”ฉ ๋” ์‹คํ–‰๋˜์–ด N+1 ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด Fetch Join ์ด๋‹ค. ์—ฐ๊ด€๋œ ๊ฒƒ๋“ค์„ ํ•œ๋ฒˆ์— ๋‹ค ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊นŒ์ง€ ์‹ค์ œ ๊ฐ’์œผ๋กœ ์ „๋ถ€ ์ฑ„์›Œ์ค€๋‹ค. (์ฆ‰, ์กฐ์ธ๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ select ์ ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค๋„ ์ „๋ถ€ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ)

 

EntityGraph

- data jpa๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ fetch join ์„ jpql ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

JpaRepository๋ฅผ ์ƒ์†๋ฐ›๋Š” repository๊ฐ€ ์žˆ์„ ๋•Œ 

@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();

์ด๋ ‡๊ฒŒ ํ•ด์ค„ ๊ฒฝ์šฐ findAll์„ ํ•  ๋•Œ ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ์ธ team์˜ ์ •๋ณด๋ฅผ fetch joinํ•ด์„œ ์ „๋ถ€ ๊ฐ€์ ธ์˜จ๋‹ค. 

 

@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();

์œ„์™€ ๊ฐ™์ด jpql์— fetch join์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. 

 

@EntityGraph(attributePaths = {"team"})
List<Member> findByUsername(String username)

๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆด ๋•Œ๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.