본문 바로가기
Backend/JPA

[JPQL] 경로 표현식

by 2245 2023. 12. 25.

출처

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런

회사땜에 매일 바쁜 와중에 학원이라도 다닐까 생각했는데 마침 JPA 강의가 생겨서 꿀 타이밍이네요. 저는 이 전에 JPA 책을 보고 공부 했었는데요 궁금했던 점, 업무에 적용하며 고민하고 해결하

www.inflearn.com

 

목차

     

    경로 표현식?

    .(점)을 찍어 객체 그래프를 탐색하는 것을 의미합니다.

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

     

     

    경로 표현식 용어 정리

    • 상태 필드(state field): 단순히 값을 저장하기 위한 필드 (ex) m.username)
    • 연관 필드(association field): 연관관계를 위한 필드
      • 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 (ex) m.team)
      • 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 (ex) m.orders)

    세 필드 중 어떤 곳으로 그래프 탐색을 하냐에 따라 내부적 동작 방식이 달라지므로, 꼭 구분해서 이해해야 합니다.

     

     

     

    경로 표현식 특징

    • 상태 필드(state field): 경로 탐색의 끝. 더 이상 탐색 불가 (.(점)을 찍어서 더 이상 탐색할 수 없다. ex) m.username. (x))
    • 단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 더 탐색 가능 (ex) m.team.getName())
    • 컬렉션 값 연관 경로: 묵시적 내부 조인 발생, 더 이상 탐색 불가 (ex) t.members. (X), 단, t.members.size는 가능)
    참고 탐색을 하고싶다면, FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능합니다.

     

    select m.username from Team t join t.members m​

     

     

    단일 값 연관 경로 탐색 - 묵시적 조인

    [JPQL]

    select m.team from Member m

     

    [SQL] : 묵시적 조인 발생

    select 
      team_id as id, 
      team_name as name,
    from
      Member member
    inner join
      Team team
        on member.TEAM_ID = team.id

     

    주의 사항 

    • 항상 내부 조인입니다. 
    • 조인은 SQL 튜닝에 중요 포인트입니다. 
    • 하지만, 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만, 묵시적 조인으로 인해 SQL의 FROM (JOIN) 절에 영향을 주므로 예상치 못한 SQL이 발생합니다.
    • 즉, 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 어렵습니다.  
    • 명시적 조인 사용해야 합니다.  

     

    명시적 조인

    join 키워드 직접 사용

    select m from Member m join m.team t

     

     

     

    경로 표현식 예제

    select o.member.team from Order o → 성공 단, 내부 조인 3번 발생
    select t.members from Team → 성공
    select t.members.username from Team t → 실패
    select m.username from Team t join t.members m → 성공

     

     

    실무 조언

    • 가급적 묵시적 조인 대신에 명시적 조인 사용 (거의 항상..)
    • 조인은 SQL 튜닝에 중요 포인트
    • 묵시적 조인은 조인이 일어나는 상황을 한 눈에 파악하기 어려움

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

    [JPQL] 페치 조인(fetch join)  (0) 2023.12.25
    [JPQL] 서브 쿼리  (0) 2023.12.24
    [JPQL] 벌크 연산  (0) 2023.12.24
    [JPQL] 조인  (0) 2023.12.24
    [JPQL] 프로젝션  (0) 2023.12.24