JPQL에서 사용하는 경로 표현식과 경로 표현식으로 인한 묵시적 조인을 알아보자.
경로 표현식은 .(점)을 찍어서 객체 그래프를 탐색하는 것이다.
상태 필드는 단순히 값을 저장하기 위한 필드이다.
경로 탐색의 끝으로 더는 탐색할 수 없다.
// JPQL
select m.username, m.age from Member m
// SQL
select m.name, m.age from Member m
단일 값 연관 필드는 조회 대상이 엔티티(@ManyToOne
, @OneToOne
)이다.
묵시적으로 내부 조인이 일어난다.
단일 값 연관 경로는 계속 탐색할 수 있다.
// JPQL
select o.member from Order o
// SQL
select m.*
from Orders o
inner join Member m on o.member_id=m.id
// JPQL
select o.member.team
from Order o
where o.product.name = 'productA' and o.address.city = 'JINJU'
// SQL
select t.*
from Orders o
inner join Member m on o.member_id=m.id
inner join Team t on m.team_id=t.id
inner join Product p on o.product_id=p.id
where p.name='productA' and o.city='JINJU'
컬렉션 값 연관 필드는 조회 대상이 컬렉션(@OneToMany
, @ManyToMany
)이다.
묵시적으로 내부 조인이 일어난다.
더는 탐색할 수 없다. 단 from 절에서 조인을 통해 별칭을 얻으면 별칭으로 추가 탐색이 가능하다.
select t.members from Team t // O
select t.members.username from Team t // X
select m.username from Team t join t.members m // O
경로 탐색을 사용하면 묵시적 조인이 발생해서 SQL에서 내부 조인이 발생할 수 있다. 참고로 묵시적 조인은 모두 내부 조인이다.
명시적 조인: join을 직접 작성하는 것
묵시적 조인: 경로 표현식에 의해 묵시적으로 내부 조인이 발생하는 것
조인이 성능 튜닝의 핵심이다. 그런데 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다. 따라서 성능 튜닝을 용이하게 하기 위해 묵시적 조인보다 명시적 조인을 사용하자.
많은 도움이 되었습니다, 감사합니다.