반응형
본 내용은 온라인 강의 사이트 인프런의 김영한 님의 강의 내용이 포함되어 있습니다.
'자바 ORM 표준 JPA 프로그래밍 - 기본편'
경로 표현식
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은 성능상 차지하는 부분이 크며, 묵시적 조인이 발생하는 상황을 파악하기 어렵다
- 단순한 경우에는 문제가 없으나, 실무에서는 매우 복잡하고 규모가 크기 때문에 성능 저하가 발생할 수 있다.
- 따라서 되도록 명시적 조인을 사용하는 것이 좋다.
반응형
'프레임워크(Framework) > JPA' 카테고리의 다른 글
[JPA] JPQL - 다형성 쿼리 - 객체지향 쿼리 언어 JPQL (9) (0) | 2022.12.21 |
---|---|
[JPA] JPQL 페치 조인(Fetch join) - 객체지향 쿼리 언어 JPQL (8) (0) | 2022.12.20 |
[JPA] JPQL 타입 표현과 기타식, 조건식 - 객체지향 쿼리 언어 JPQL (6) (0) | 2022.12.18 |
[JPA] JPQL 서브 쿼리 - 객체지향 쿼리 언어 JPQL (5) (0) | 2022.12.17 |
[JPA] JPQL 조인(Join) - 객체지향 쿼리 언어 JPQL (4) (0) | 2022.12.16 |