ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 경로 표현식
    JPA/JPQL 2023. 8. 9. 11:43

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

     

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

     

     

    경로 표현식 종류

    - 상태 필드(state filed) : 단순히 값을 저장하기 위한 필드

     

    - 연관 필드(association filed) : 연관관계를 위한 필드

    • 단일 값 연관 필드 : @ManyToOne, @OneToOne, 매핑 대상이 엔티티
    • 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 매핑 대상이 컬렉션

     

     

    경로 표현식 특징

    1. 상태 필드 : 경로 탐색의 끝이며 탐색을 하지 않음

    2. 단일 값 연관 경로 : 묵시적 내부 조인 발생, 탐색을 함

    3. 컬렉션 값 연관 경로 : 묵시적 내부 조인 발생, 탐색을 하지 않음

     

     

     

    1. 상태 필드는 m.username 같은 건데 username에서 .을 찍어서 더 갈 수 없으니 끝

     

     

    2. 단일 값 연관 경로는 m.team 같은 건데 m.team.name 등으로 탐색을 계속 할 수 있음 

     

    묵시적 내부 조인

    "select m.username From Member m"

    위의 쿼리는 Member 엔티티의 요소만 쓰기 때문에 join이 필요 없다.

    "select m.team From Member m"

    위의 쿼리는 Member 엔티티와 매핑되어있는 team을 조회하기 때문에 team을 join해서 select 한다.

     

     

    묵시적 내부 조인은 join이라는 키워드를 사용하지 않았기 때문에 join 쿼리가 안나갈 것이라고 생각되는데 묵시적으로 join이 되기 때문에 쿼리 튜닝을 하거나 성능 최적화를 할 때 효율적이지 않아서 되도록 묵시적 내부 조인을 사용하기 보다는 join을 사용하는 것이 좋다고 한다.

     

     

     

     

    3. 컬렉션 값 연관 경로

    "select t.members From Team t"

    위와 같은 쿼리가 컬렉션 값 연관 경로이다. 팀이라는 엔티티 하나에 member가 여러명이니 일대다 매핑이고, 그렇기 때문에 수많은 members 사이에서 어떤 member를 찾을지 정해지지 않아서 JPA에서 제약을 걸어 탐색이 불가능하다. 하지만 다른 엔티티를 조회하기 때문에 묵시적 내부 조인은 발생한다.

     

    t.members뒤에 .을 찍어서 다른 변수명을 붙일 수가 없다. size 정도는 가능하다.

     

     

    이럴 때에는

    "select m.username From Team t join t.members m"

    명시적 join을 사용해서 m.username 등으로 사용할 수 있다.

    명시적 join을 하면 별칭 m을 얻어서 m.username 등으로 붙일 수 있기 때문이다.

     

     

     

    명시적 조인 : join 키워드 직접 사용

    - select m from Member m join m.team t

     

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

    - select m.team from Member m

     

     

     

    결론

    묵시적 join을 쓰지말고 명시적 join을 써야 한다.

    한 마디로 다른 엔티티에 접근할 때에는 join을 이용해서 접근해야 한다는 것이다. 그래야지 나중에 쿼리 튜닝을 하거나 이후 작업을 할 때에 에러 사항이 거의 없다.

     

    묵시적 join을 예를 들면 select o.member.team from Order o 같은 쿼리인데 이걸 보고 어떤 쿼리가 나갈지 예상하기 쉽지 않다.

     

    경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM (JOIN) 절에 영향을 줌

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

    페치 조인의 한계  (0) 2023.08.09
    페치 조인(fetch join)  (0) 2023.08.09
    조건식 (CASE)  (0) 2023.07.14
    서브 쿼리  (0) 2023.07.14
    페이징, 조인  (0) 2023.07.14
Designed by Tistory.