entity
에 join
을 걸더라도 JPQL
에서 조회하는 주체가 되는 entity
에 대해서만 select
하여 영속화한다.join
대상에 대한 영속성에는 관여하지 않는다.SQL
조인의 종류가 아니라, JPQL
에서 성능 최적화를 위해 제공하는 기능entity
외에 fetch join
이 걸린 연관 관계가 있는 entity
까지 함께 select
하여 영속화한다.join fetch
키워드를 사용한다.[LEFT [OUTER] | INNER] JOIN FETCH 조인경로
💡 연관 관계가 있는
entity
에 대한 데이터가 필요한 경우에만fetch join
을 사용하고, 단순히 검색 조건에서만 연관 관계entity
가 사용되는 경우는join
만 사용하는 것이 좋다.
📗 N+1 문제란?
연관 관계가 설정된Entity
를 조회할 경우, 하위Entity
의 데이터 개수(n
) 만큼 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 문제를 의미한다.
@Query("select a from AccountLog a join fetch a.member join fetch a.category")
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