목차
경로표현식 개요
경로표현식이란 점을 찍어 객체 그래프를 탐색하는 것 입니다.
경로표현식은 3가지 방법이 있습니다. 경로표현식은 내부적으로 동작하는 방식이 달라집니다.
select m.username -> 상태 필드로 객체 그래프를 탐색
from Member m
join m.team t -> 단일 괎 연관 필드 (엔티티 연관)
join m.orders o -> 컬렉션 값 연관 필드(양방향 연관)
where t.name = 'teamA'
경로표현식의 3가지 방법과 특징
경로표현식은 상태 필드, 단일 값 연관필드, 컬렉션 값 연관 필드가 있습니다.
상태 필드(state field)
단순히 값을 저장하기 위한 필드
경로 탐색의 끝입니다. m.username 일 경우 username에서 점을 찍고 탐색할 것이 더 이상 없습니다.
연관 필드(단일 값 연관 필드, 컬렉션 값 연관 필드)
연관관계를 위한 필드, 2가지가 있습니다.
- 단일 값 연관 필드
- 컬렉션 값 연관 필드
단일 값 연관 필드
대상이 엔티티인 경로표현식입니다. @ManyToOne, @OneToOne
묵시적인 내부 조인이 발생합니다.
더 이상 탐색이 가능합니다. m.team으로 탐색한 이후 m.team.name 이런 식으로 추가로 더 탐색할 수 있습니다.
컬렉션 값 연관 필드
대상이 컬렉션인 경로표현식입니다. @OneToMany, @ManyToMany
묵시적인 내부 조인이 발생합니다.
탐색을 더 이상 할 수 없습니다. m.orders 에서 name으로 탐색하려해도 orders는 어떤 것의 name인지 알 수 없기 때문에 추가 탐색이 안됩니다.
FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능합니다.
select m From Team t join t.members m
명시적 조인과 묵시적 조인
명시적 조인
명시적으로 join 키워드를 직접 사용하는 것 입니다.
select m from Member m join m.team t
묵시적 조인
경로표현식에 의해 묵시적으로 SQL 조인이 발생하는 것 입니다.(내부 조인만 가능합니다. 외부조인을 할려면 명시적 조인 사용합니다)
select m.team from Member m
// 다음과 같은 jpql 쿼리를 전송하면
select o.member
from Order o
// DB에는 해당 SQL이 전송됩니다.
select m.*
from Orders o
inner join Member m on o.member_id = m.id
위의 코드처럼 JPQL에는 JOIN을 하지 않지만 묵시적 조인을 통해 SQL에는 INNER JOIN이 발생합니다. 실제 서비스 환경에서는 DB가 크고 복잡하기 때문에 묵시적 조인으로 인해 예상하지 못한 성능저하가 발생할 수 있고 상황파악에도 어렵기 떄문에 튜닝의 난이도 또한 상승합니다.
무조건 묵시적 조인 대신에 명시적 조인을 사용하는 것이 좋습니다.