select m.username //상태필드
from Member m
join m.team t //단일 값 연관 필드
join m.orders o //컬렉션 값 연관 필드
where t.name = "팀A"
-위 세 가지 각자 내부적으로 동작하는 방식이 달라지므로 구분을 잘해서 이해해야 한다.
select m.username From Member m
상태 필드의 경우 username 필드에 접근한 후 더 이상 접근할 필드나 속성이 존재하지 않는다. 그래서 더 이상 탐색이 불가능하다.
select m.team From Member m
단일 값 연관 경로의 경우엔 Member 안에 team 접근후 team 안에 있는 다양한 필드에 더 접근할 수 있어 탐색이 가능하다.
m.team.name
위 표현식의 경우 name 이 상태 필드인 경우엔 이 역시 경로 탐색의 끝이므로 더 이상의 탐색이 불가능하다.
묵시적 내부 조인의 경우엔 위 예제를 실행해보면 나오는 로그를 보면 알 수 있다.
이런 현상이 일어나는 이유는 객체에서야 점 표기법으로 간단하게 가져오면 되지만 DB 에서는 Member 에 있는 Team 의 컬럼과 값을 가져오려면 어쩔 수 없이 join 이 일어나게 된다. 이런 현상을 묵시적 내부 조인이라 한다. 그래서 웬만하면 묵시적 내부 조인이 일어나지 않게 쿼리를 작성하는 것이 좋다. 그리고 또 다른 이유는 예제처럼 작성할 경우 의도치 않는 JOIN 문이 계속 발생하면 한 번에 찾기가 힘들어서 웬만하면 JPA 라도 큰 애플리케이션이 SQL 과 비슷하게 작성하는 것이 좋다.
String query = "select t.members from Team t";
컬렉션의 경우 점 표기법으로 더 이상 가져올만한게 없다. t.members 뒤에 점(.)을 찍으면 자동완성으로 나오는게 size 밖에 없다. 즉, 탐색이 불가능하다. 만약 members 에 있는 username 을 가져오고 싶을 경우엔 명시적 조인을 사용하면 된다.
String query = "select m.username from Team t join t.membners";
select m.*
from Orders o
inner join Member m on o.member_id = m.id
위 JPQL 로 작성한 쿼리도 묵시적 내부 조인이 발생한다. 고로 사용하지 않는게 좋다.
가급적 묵시적 조인 대신에 명시적 조인 사용
조인은 SQL 튜닝에 중요 포인트
묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어려움