경로 표현식

PPakSSam·2022년 1월 25일
0
post-thumbnail

1. 명시적 조인, 묵시적 조인


명시적 조인

  • JOIN 키워드를 직접 사용하는 것

  • select m from Member m join m.team t

묵시적 조인

  • 경로 표현식에 의해 묵시적으로 SQL 조인이 발생하는 것 (내부 조인만 가능)

  • select m.team from Member m

2. 경로 표현식이란


경로 표현식이란 .(점)을 찍어 객체 그래프를 탐색하는 것이다.

select m.username -> 상태 필드
from Member m
join m.team t -> 단일 값 연관 필드
join m.orders o -> 컬렉션 값 연관 필드
where t.name = '팀A'

3. 경로 표현식 종류


상태 필드

단순히 값을 저장하기 위한 필드이다. (ex: m.username)
경로 탐색의 끝이므로 탐색을 더 이상 할 수 없다.

JPQL : select m.username, m.age from Member m
SQL : select m.username, m.age from Member m

단일값 연관 필드

@ManyToOne, @OneToOne이 붙어 있는 필드이며 엔티티를 대상으로 한다.
묵시적 내부 조인이 발생하며 탐색을 할 수 있다.

JPQL : select o.member from Order o
SQL : select m.* from Orders o inner join Member m on o.member_id = m.id
select o.member.team from Order o (O)

// o.member의 경우 단일값 연관필드이므로 탐색이 가능하다.

컬렉션 값 연관 필드

@OneToMany가 붙어있는 필드이며 컬렉션을 대상으로 한다.
묵시적 내부 조인이 발생하며 탐색을 더 이상 할 수 없다.

JPQL : select t.members from Team
SQL : select m.* from Team t inner join Member m on t.member_id = m.id
select t.members.username from Team t (X)

// t.members는 컬렉션 연관필드이므로 탐색이 불가능하다.
select m.username from Team t join t.members m 

// 굳이 컬렉션 연관필드를 경로탐색하고 싶다면 명시적 조인을 사용해야 한다.

4. 주의사항


  • 묵시적 조인은 항상 내부 조인임을 잊지말자.

  • 컬렉션은 경로 탐색의 끝이며 명시적 조인을 통해 별칭을 얻어야 한다.

  • 경로 탐색은 SELECT, WHERE 절에서 사용하지만 묵시적 조인에 의해 SQL의 FROM (JOIN)절에 영향을 주는 것을 잊지말자.

5. 실무 조언


  • 가급적 묵시적 조인 대신에 명시적 조인을 사용할 것

  • 조인은 SQL 튜닝에 중요 포인트이다.

  • 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다. -> 가독성이 떨어진다.

profile
성장에 대한 경험을 공유하고픈 자발적 경험주의자

0개의 댓글