단순히 값을 저장하기 위한 필드
ex) m.username
@ManyToOne
, @OneToOne
: 대상이 엔티티
ex) m.team
JPQL
select o.member from Order o
SQL
select m.*
from Orders o
inner join Member m on o.member_id = m.id
∴JPQL과 쿼리를 맞춰서 명시적으로 표현하면, 직관적으로 알 수 있다.
@OneToMany
, @ManyToMany
: 대상이 컬렉션
ex) m.orders
경로 표현식을 응용해보자
ex1.
select o.member.team from Order o
-> 가능한 표현식.
-> join이 많이 나간다.
ex2.
select t.members from Team
-> 가능한 표현식.
-> 컬렉션이 대상이므로 더 이상의 탐색은 불가능 하다.
ex3.
select t.members.username from Team
-> 불가능한 표현식.
-> ex2.에서 username
을 탐색한 것이다. 컬렉션에서 탐색은 불가능 하다.
ex4.
select m.username from Team t join t.member m
-> 가능한 표현식.
-> 명시적 조인을 사용했다.
명시적 조인 : join 키워드를 직접 사용한다.
select m from Member m join m.team t
묵시적 조인 : 경로 표현식에 의해 묵시적으로 SQL 조인 발생 (내부 조인만 가능)
select m.team from Member m
가급적 묵시적 조인 대신 명시적 조인을 사용한다.
-> 조인은 SQL 튜닝에 있어 중요 포인트이다.
묵시적 조인은 조인이 일어나는 상황을 한 눈에 파악하기 어렵다.
참고 :
김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.