11. 객체지향 쿼리 언어 - 중급 문법 (경로 표현식)

HotFried·2023년 10월 4일
0

경로 표현식

  • .(점)을 찍어 객체 그래프를 탐색하는 것

상태 필드(state field)

단순히 값을 저장하기 위한 필드
ex) m.username

  • 경로 탐색의 끝, 탐색 X
    -> 필드에서 더이상 탐색할 것이 없기 때문에 탐색은 불가능하다.

단일 값 연관 필드

@ManyToOne, @OneToOne : 대상이 엔티티
ex) m.team

  • 묵시적 내부 조인(inner join)발생, 탐색 O
    -> 대상이 엔티티이기 때문에 추가로 탐색이 가능하다.

JPQL

select o.member from Order o

SQL

select m.* 
 from Orders o 
 inner join Member m on o.member_id = m.id
  • 실무에서는 묵시적 내부 조인이 일어나지 않도록 한다.
  • 편해보이지만 쿼리 튜닝이 어렵다.
  • 무분별하게 join이 나가면 성능에 영향을 줄 수 있다.

∴JPQL과 쿼리를 맞춰서 명시적으로 표현하면, 직관적으로 알 수 있다.


컬렉션 값 연관 필드

@OneToMany, @ManyToMany : 대상이 컬렉션
ex) m.orders

  • 묵시적 내부 조인(inner join)발생, 탐색 X
    -> 컬렉션이 대상이다. 컬렉션에 여러 객체들이 존재하기 때문에 여러 객체들을 모두 탐색하는 것은 불가능하다.

예제

경로 표현식을 응용해보자

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

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

  • 항상 내부 조인이 발생한다.
  • 컬렉션은 경로 탐색의 끝이다. 명시적 조인을 통해 별칭을 얻어야한다.
  • 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM (JOIN)절에 영향을 준다.

NOTE:

  • 가급적 묵시적 조인 대신 명시적 조인을 사용한다.
    -> 조인은 SQL 튜닝에 있어 중요 포인트이다.

  • 묵시적 조인은 조인이 일어나는 상황을 한 눈에 파악하기 어렵다.


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글