JPQL 에서는 두 가지 방식으로 테이블 간 조인을 실행할 수 있다.
1. 명시적 조인
일반적인 SQL문 처럼 join 키워드를 직접적으로 사용해 명시적으로 조인 여부를 나타내는 것
ex : select t.members from Team t join t.members m
2. 묵시적 조인
from절에서 조인 관계를 따로 명시하진 않는다. select절에서 의존성을 가지는 다른 엔티티 객체를 조회하려 할 경우 JPA가 알아서 PK, FK를 가지고 해당 테이블과 inner join을 수행하는 쿼리를 날려준다.
당연한 이야기지만 묵시적 조인에서는 inner join만 가능하다. outter join을 하려면 만드시 명시적 조인을 사용해야 한다.
ex : select t.members from Team -> 따로 조인 없이 Team에 있는 members에 접근
주의할 점,
묵시적 조인으로 해당 엔티티가 가지고있는 컬렉션을 조회할 순 있으나 이 컬렉션은 경로 탐색의 끝이 된다.
select t.members.username from Team 이런식으로 컬렉션 members를 넘어선 경로 탐색이 불가능하다.
이런 식의 조회가 하고 싶다면 명시적 조인을 통해 해당 컬렉션에 대한 alias를 얻어와 그걸 통해 접근해야 한다.
select m.username from Team join t.members m 이렇게 짜면 컬렉션의 범위에서 더 깊은 경로 탐색을 실시할 수 있다.
권장사항은 항상 명시적 조인을 사용하는 것이다. 당장 쓰기에 묵시적 조인이 편할 수는 있지만 성능이나 유지보수 측면을 고려하였을 때 명시적 조인을 사용하는 것이 바람직하다.
'김영한님 스프링 강의 정리 > JPA' 카테고리의 다른 글
JPQL 벌크 연산 (0) | 2021.03.10 |
---|---|
fetch join의 기능과 한계 (0) | 2021.03.10 |
JPQL - 프로젝션과 페이징 기능 (0) | 2021.03.09 |
JPQL - 쿼리 타입과 파라미터 바인딩 (0) | 2021.03.09 |
값 타입과 immutable 객체 (0) | 2021.03.03 |