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