점 찍어서 객체 그래프 탐색하는 거.
그냥 우리가 계속 해왔던
m.username
m.team
이런 거
근데 또 종류가 있음.
select m.username //상태 필드
from Member m
join m.team t //단일값 연관필드
join m.orders o //컬렉션 값 연관필드
where t.name
저 필드 종류에 따라 동작방식이 다름.
상태필드 : 단순히 값을 저장하기 위한 필드.
연관 필드 : 연관관계를 위한 필드
- 단일값 연관필드 : @ManyToOne, @OneToOne 대상이 엔티티.
- 컬렉션 값 연관필드 : @OneToMany, @ManyToMany 대상이 컬렉션일 때
동작
상태필드 : 경로 탐색의 끝. 탐색X
select m.username From Member m
m.username이후에 더 경로가 없다. 더 탐색(추가로 쿼리를 붙이지 않는다.)하지 않는다.
Hibernate:
/* select
m.username
From
Member m */ select
m1_0.username
from
Member m1_0
단일 값 연관 경로 : 묵시적 내부 조인 발생, 탐색 O
select m.team From Member m
Hibernate:
/* select
m.team
From
Member m */ select
t1_0.id,
t1_0.name
from
Member m1_0
join
Team t1_0
on t1_0.id=m1_0.team_id
이런 식으로 연관관계 중 단일값은 묵시적으로 내부 join이 발생한다.
이렇게 묵시적으로 내부join이 발생하는 건 왠만하면 짜서는 안된다.
join은 성능 튜닝에 막대한 영향을 미친다. 근데 이렇게 막 join해서 나가버리면 성능 상 문제가 있을 수 있다.
JPQL은 왠만하면 SQL이랑 비슷하게 맞추는 게 좋다.
JPQL은 저렇게 자동으로 나가는 게 있어서, 비슷하게 맞춰놓지 않으면 유지보수 할 때 어디서 나온 쿼리인지 찾기가 힘들수도 있다.
또, 성능튜닝을 위해 JPQL 튜닝? 도 해야하고?
또, 이런 단일값 연관관계의 중요한 점은,
select m.team.members From Member m
이렇게 경로를 더 탐색할 수 있다는 거다.
컬렉션 값 연관경로 : 묵시적 내부 조인 발생, 탐색 X
select t.members From Team t
저렇게 컬렉션 필드는 . 해서 추가로 탐색할 수 없다. 단 하나되는게, t.members.size 해서 컬렉션의 사이즈는 가져올 수 있다.
근데 추가로 탐색할 수 있게 만드는 게, 명시적 조인 하면서 별칭을 주면서 그걸로 탐색하면 된다.
select m.username from Team t join t.members m
이렇게 명시적 조인으로 별칭을 주면서, 그걸 통해 탐색할 수 있다.
Hibernate:
/* select
t.members
From
Team t */ select
m1_0.id,
m1_0.age,
t1_0.id,
t1_0.name,
m1_0.type,
m1_0.username
from
Team t1_0
join
Member m1_0
on t1_0.id=m1_0.team_id
묵시적인 내부조인이 발생한다.
여러가지 살펴봤다.
상태필드 같은 경우는 나가는 SQL과 거의 유사하다.
그런데 연관관계의 경우, 추가로 join이 발생한다.
JPQL에서 그냥 묵시적 JOIN은 쓰지 말자.
명시적 JOIN만 쓰자.
명시적 JOIN을 써야 JPQL 쿼리 튜닝하기도 쉽다.
상태필드는 그냥 쓰면 되고,
연관관계가 있는 것은,
그냥 명시적으로 join 붙여서 하셈.
select m.team from Member m
이거를
select m from Member m join m.team t
이렇게. 명시적으로 join 해서.
select m.username from Team t join t.members m
경로 탐색 시 일어나는 묵시적 조인 특징
항상 내부조인
컬렉션은 경로 탐색의 끝임. 더 하려면 명시적 JOIN으로 별칭을 줘서 써야 함.
경로 탐색은 주로 select, where절에서 사용하지만 묵시적 조인으로 인해 SQL의 from(join)절에 영향을 줌.
가급적 명시적 조인을 쓸 것
조인은 SQL 튜닝의 중요 포인트
또 묵시적 조인은 모르는 사람은 한 눈에 판단할 수 없음.
'JPA > JPA 기본' 카테고리의 다른 글
48. 페치 조인 한계 (0) | 2023.11.01 |
---|---|
47. 페치 조인 기본 (0) | 2023.11.01 |
45. JPQL 함수 (0) | 2023.10.31 |
44. 조건식. case 등등 (0) | 2023.10.31 |
43. JPA 타입 표현과 기타식 (0) | 2023.10.31 |