출처
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
목차
경로 표현식?
.(점)을 찍어 객체 그래프를 탐색하는 것을 의미합니다.
select m.username → 상태 필드
from Member m
join m.team t → 단일 값 연관 필드
join m.orders o → 컬렉션 값 연관 필드
where t.name = '팀A'
경로 표현식 용어 정리
- 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex) m.username)
- 연관 필드(association field): 연관관계를 위한 필드
- 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 (ex) m.team)
- 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 (ex) m.orders)
세 필드 중 어떤 곳으로 그래프 탐색을 하냐에 따라 내부적 동작 방식이 달라지므로, 꼭 구분해서 이해해야 합니다.
경로 표현식 특징
- 상태 필드(state field): 경로 탐색의 끝. 더 이상 탐색 불가 (.(점)을 찍어서 더 이상 탐색할 수 없다. ex) m.username. (x))
- 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 더 탐색 가능 (ex) m.team.getName())
- 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 더 이상 탐색 불가 (ex) t.members. (X), 단, t.members.size는 가능)
참고 탐색을 하고싶다면, FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능합니다.
select m.username from Team t join t.members m
단일 값 연관 경로 탐색 - 묵시적 조인
[JPQL]
select m.team from Member m
[SQL] : 묵시적 조인 발생
select
team_id as id,
team_name as name,
from
Member member
inner join
Team team
on member.TEAM_ID = team.id
주의 사항
- 항상 내부 조인입니다.
- 조인은 SQL 튜닝에 중요 포인트입니다.
- 하지만, 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만, 묵시적 조인으로 인해 SQL의 FROM (JOIN) 절에 영향을 주므로 예상치 못한 SQL이 발생합니다.
- 즉, 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵습니다.
- 명시적 조인 사용해야 합니다.
명시적 조인
join 키워드 직접 사용
select m from Member m join m.team t
경로 표현식 예제
select o.member.team from Order o → 성공 단, 내부 조인 3번 발생
select t.members from Team → 성공
select t.members.username from Team t → 실패
select m.username from Team t join t.members m → 성공
실무 조언
- 가급적 묵시적 조인 대신에 명시적 조인 사용 (거의 항상..)
- 조인은 SQL 튜닝에 중요 포인트
- 묵시적 조인은 조인이 일어나는 상황을 한 눈에 파악하기 어려움
'Backend > JPA' 카테고리의 다른 글
[JPQL] 페치 조인(fetch join) (0) | 2023.12.25 |
---|---|
[JPQL] 서브 쿼리 (0) | 2023.12.24 |
[JPQL] 벌크 연산 (0) | 2023.12.24 |
[JPQL] 조인 (0) | 2023.12.24 |
[JPQL] 프로젝션 (0) | 2023.12.24 |