DB/JPA

[JPA] 경로 표현식

너지살 2022. 6. 15. 01:32

목차

     

    경로표현식 개요

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

    경로표현식은 3가지 방법이 있습니다. 경로표현식은 내부적으로 동작하는 방식이 달라집니다.

    select m.username -> 상태 필드로 객체 그래프를 탐색
    from Member m
    join m.team t  -> 단일 괎 연관 필드 (엔티티 연관)
    join m.orders o -> 컬렉션 값 연관 필드(양방향 연관)
    where t.name = 'teamA'

     

     

     

    경로표현식의 3가지 방법과 특징

    경로표현식은 상태 필드, 단일 값 연관필드, 컬렉션 값 연관 필드가 있습니다.

     

     

    상태 필드(state field) 

    단순히 값을 저장하기 위한 필드

    경로 탐색의 끝입니다. m.username 일 경우 username에서 점을 찍고 탐색할 것이 더 이상 없습니다.

     

     

    연관 필드(단일 값 연관 필드, 컬렉션 값 연관 필드) 

    연관관계를 위한 필드, 2가지가 있습니다.

    • 단일 값 연관 필드
    • 컬렉션 값 연관 필드 

     

    단일 값 연관 필드

    대상이 엔티티인 경로표현식입니다. @ManyToOne, @OneToOne 

    묵시적인 내부 조인이 발생합니다. 

    더 이상 탐색이 가능합니다. m.team으로 탐색한 이후 m.team.name  이런 식으로 추가로 더 탐색할 수 있습니다.

     

    컬렉션 값 연관 필드 

    대상이 컬렉션인 경로표현식입니다. @OneToMany, @ManyToMany

    묵시적인 내부 조인이 발생합니다.

    탐색을 더 이상 할 수 없습니다. m.orders 에서 name으로 탐색하려해도 orders는 어떤 것의 name인지 알 수 없기 때문에 추가 탐색이 안됩니다.

    FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능합니다.

    select m From Team t join t.members m

     

     

    명시적 조인과 묵시적 조인

     

    명시적 조인

    명시적으로 join 키워드를 직접 사용하는 것 입니다. 

    select m from Member m join m.team t

     

    묵시적 조인

    경로표현식에 의해 묵시적으로 SQL 조인이 발생하는 것 입니다.(내부 조인만 가능합니다. 외부조인을 할려면 명시적 조인 사용합니다)

    select m.team from Member m

     

    // 다음과 같은 jpql 쿼리를 전송하면
    select o.member 
    from Order o
    
    // DB에는 해당 SQL이 전송됩니다.
    select m.*
    from Orders o
    inner join Member m on o.member_id = m.id

    위의 코드처럼 JPQL에는 JOIN을 하지 않지만 묵시적 조인을 통해 SQL에는 INNER JOIN이 발생합니다. 실제 서비스 환경에서는 DB가 크고 복잡하기 때문에 묵시적 조인으로 인해 예상하지 못한 성능저하가 발생할 수 있고 상황파악에도 어렵기 떄문에 튜닝의 난이도 또한 상승합니다.

    무조건 묵시적 조인 대신에 명시적 조인을 사용하는 것이 좋습니다.