[JPA] Fetch Join

해니·2024년 9월 2일
0

JPA

목록 보기
6/8
post-thumbnail

일반 Join과 Fetch Join 차이점


일반 Join

  • 연관 관계가 있는 entityjoin을 걸더라도 JPQL에서 조회하는 주체가 되는 entity에 대해서만 select 하여 영속화한다.
    • join 대상에 대한 영속성에는 관여하지 않는다.

Fetch Join

  • SQL 조인의 종류가 아니라, JPQL에서 성능 최적화를 위해 제공하는 기능
  • 주체가 되는 entity 외에 fetch join이 걸린 연관 관계가 있는 entity까지 함께 select 하여 영속화한다.
  • join fetch 키워드를 사용한다.
    • [LEFT [OUTER] | INNER] JOIN FETCH 조인경로

💡 연관 관계가 있는 entity에 대한 데이터가 필요한 경우에만 fetch join을 사용하고, 단순히 검색 조건에서만 연관 관계 entity가 사용되는 경우는 join만 사용하는 것이 좋다.



Fetch Join을 이용한 N+1 문제 해결


📗 N+1 문제란?
연관 관계가 설정된 Entity를 조회할 경우, 하위 Entity의 데이터 개수(n) 만큼 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 문제를 의미한다.


  • Repository
@Query("select a from AccountLog a join fetch a.member join fetch a.category")
  • Console
Hibernate: 
select al1_0.account_log_id,c1_0.category_id,c1_0.category_name,c1_0.category_type,c1_0.mod_dt,c1_0.reg_dt,al1_0.date,al1_0.detail,m1_0.member_id,m1_0.email,m1_0.mod_dt,m1_0.name,m1_0.reg_dt,al1_0.mod_dt,al1_0.money,al1_0.reg_dt 
from account_log al1_0 
join member m1_0 on m1_0.member_id=al1_0.member_id 
join category c1_0 on c1_0.category_id=al1_0.category_id





출처
[Spring JPA] 일반 Join과 Fetch Join의 차이
N+1 문제를 해결하기 위한 FetchJoin, 일반 Join과의 차이점은
[JPA] JPQL - Fetch Join

profile
💻 ⚾️ 🐻

0개의 댓글