프레임워크(Framework)/JPA

[JPA] JPQL 경로 표현식 - 객체지향 쿼리 언어 JPQL (7)

잇트루 2022. 12. 19. 21:11
반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
 

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

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

경로 표현식

jpql의 쿼리문 작성 시 점(.)을 이용하여 객체의 값에 접근할 수 있다. 이처럼 점(.)을 이용해 객체 그래프를 탐색하는 것을 경로 표현식이라 한다.

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

경로 표현식은 상태 필드와 상태 필드(단일 값 연관 필드, 컬렉션 값 연관 필드)가 존재한다.

각 경로 표현식은 경로 탐색이 어떤 경로로 진행되는지에 따라 결과가 달라진다.

 

상태 필드(state field)

단순히 값을 저장하기 위해 사용하는 필드이다. 상태 필드 경로는 추가 탐색이 불가능하다. (ex: m.username)

// JPQL 쿼리
select m.username from Member m

// 실행시 발생하는 SQL 쿼리
select m.username from Member m
  • 경로 탐색의 끝, m.username 이후 추가 탐색 불가

 

연관 필드(association field)

연관관계를 위한 필드이다. 묵시적으로 내부 조인이 발생하는 특징이 있다.

 

단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 (ex: m.team)

  • 단일 값 연관 경로는 추가 탐색이 가능하다. (ex: m.team.name 등)
// JPQL 쿼리
select o.member from Order o

// 실행시 발생하는 SQL 쿼리(묵시적 조인 발생)
select m.* from Orders o inner join m on o.member_id = m.id

// 추가 탐색 가능
select o.member.name from Order o

 

컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 (ex: m.orders)

  • 컬렉션 값 연관 경로는 추가 탐색이 불가능하다.
  • 하지만, from 절에서 명시적 조인을 통해 별칭을 얻으면, 별칭을 통해 탐색이 가능하다.
// JPQL 쿼리
select t.members from Team t

// 실행시 발생하는 SQL 쿼리(묵시적 조인 발생)
select t.members from Team t inner join m on m.team_id

// 명시적 조인시 별칭을 통해 추가 탐색 가능
select m.username from Team t join t.members m

 

경로 표현식 정리

// 사용 가능, 내부 조인이 2번 발생
select o.member.team from Order o

// 사용 가능
select t.members from Team

// 사용 불가, 추가 탐색 불가(컬렉션 값 연관 필드)
select t.members.username from Team t

// 사용 가능, 명시적 조인을 통해 탐색
select m.username from Team t join t.members m

 

명시적 조인과 묵시적 조인

  • 명시적 조인 : JOIN을 쿼리문에 직접 작성하는 것
  • 묵시적 조인 : 경로 표현식에 의해 묵시적으로 조인이 발생하는 것(INNER JOIN만 발생)
// 명시적 조인
select m from Member m join m.team t

// 묵시적 조인
select m.team from Member m

단일 값 연관 필드와 컬렉션 값 연관 필드로 경로 탐색을 하면 SQL에서 내부 조인이 발생한다.

이를 묵시적 조인이라 하며, 모든 묵시적 조인은 내부 조인만 발생한다. (외부 조인은 명시적으로 JOIN 키워드를 사용해야 함)

 

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

  • 묵시적 조인은 항상 내부 조인(INNER JOIN)이다.
  • 컬렉션은 추가 탐색이 불가능하다. 추가 탐색을 하려면 명시적 조인을 통해 별칭을 얻어서 사용해야 한다.
  • 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만, 묵시적 조인으로 인해 SQL의 FROM 절에 영향을 준다.
    • 다른 곳에서도 사용 가능하다.
  • JOIN은 성능상 차지하는 부분이 크며, 묵시적 조인이 발생하는 상황을 파악하기 어렵다
    • 단순한 경우에는 문제가 없으나, 실무에서는 매우 복잡하고 규모가 크기 때문에 성능 저하가 발생할 수 있다.
    • 따라서 되도록 명시적 조인을 사용하는 것이 좋다.
반응형