본문 바로가기
JPA/JPA

[JPA] JPQL - 경로 표현식(Path Expression)과 묵시적 조인

by 걸어가는 신사 2022. 1. 7.

1. 경로 표현식이란?

.(점)을 찍어 객체 그래프를 탐색하는 것이다.
select m.username from Member m join m.team t where t.name = "teamA"
  • m.username, m.team, t.name 모두 경로 표현식을 사용한다.

 

2. 경로 표현식의 종류

(1) 상태 필드(state field)

  • 단순히 값을 저장하기 위한 필드(or 프로퍼티)

(2) 연관 필드(association field)

  • 연관관계를 위한 필드, 임베디드 타입 필드(or 프로퍼티)

(i) 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티

(ii) 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션

@Entity
@Getter @Setter
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String username; //상태 필드
    private int age; //상태 필드

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM")
    private Team team; //연관 필드 (단일 값 연관 필드)
    
    @OneToMany(mappedBy = "member")
    private List<Order> orders; //연관 필드 (컬렉션 값 연관 필드)
}
  • 상태 필드 : m.username, m.age
  • 단일 값 연관 필드 : m.team
  • 컬렉션 값 연관 필드 : m.orders

 

명시적 조인 vs 묵시적 조인
(1) 명시적 조인 : JOIN을 직접 적어주는 것
ex) select m from Member m join m.team t
(2) 묵시적 조인 : 경로 표현식에 의해서 묵시적으로 조인이 일어나는 것, 내부 조인만 할 수 있다.

 

3. 경로 표현식의 특징

(1) 상태 필드 경로

경로 탐색의 끝이다. 더는 탐색할 수 없다.
(JPQL)
select m.username, m.age from Member m

(SQL)
select m.usernmae, m.age from Member m

(2) 단일 값 연관 경로

묵시적으로 내부 조인이 일어난다. 단일 값 연관 경로는 계속 탐색할 수 있다.
(JPQL)
select m.team from Member m

(SQL)
select t.* from Member m inner join Team t on m.team_id=t.id
  • m.team을 통해 Member에서 Team으로 단일 값 연관 필드로 경로 탐색을 했다.
  • 단일 값 연관 필드로 경로 탐색을 하면 SQL에서 내부 조인이 일어난다. (묵시적 조인)

(3) 컬렉션 값 연관 경로

묵시적으로 내부 조인이 일어난다. 더는 탐색할 수 없다.
  • from 절에서 조인을 통해 별칭을 얻으면 별칭으로 탐색할 수 있다. 
select t.members from Team t //성공
select t.members.username from Team t //실패
  • 컬렉션까지는 경로 탐색이 가능하다.
  • 컬렉션에서 경로 탐색을 시작하는 것은 불가능하다.
  • 만약 컬렉션에서 경로 탐색을 하고 싶다면 조인을 사용해서 새로운 별칭을 획득해야 한다.
    • from 절에서 명시적 조인을 통해 별칭을 얻는다.
select m.username from Team t join t.members m
  • join t.members m 으로 컬렉션에 새로운 별칭을 얻었다. 다시 경로 탐색을 할 수 있다.

 

4. 경로 탐색을 사용한 묵시적 조인 시 주의사항

  • 묵시적 조인은 항상 내부 조인이다.
  • 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM 절에 영향을 준다.
  • 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵다.
  • 실무에서는 묵시적 조인 대신에 명시적 조인을 사용하자.
반응형

'JPA > JPA' 카테고리의 다른 글

[JPA] JPQL - Named 쿼리 (정적 쿼리)  (0) 2022.01.08
[JPA] JPQL - 조건식  (0) 2022.01.08
[JPA] JPQL - 페치 조인(Fetch Join)  (0) 2022.01.07
[JPA] JPQL - 조인(Join)  (0) 2022.01.07
[JPA] JPQL - 기본 문법  (0) 2022.01.07

댓글