728x90
반응형
경로 표현식은 . 을 찍어서 객체 그래프를 탐색하는 것이다.
select m.username -> 상태 필드(로 객체 그래프를 탐색했다)
from Member m
join m.team t -> 단일 값 연관 필드
join m.orders o -> 컬렉션 값 연관 필드
where t.name = '팀A'
위의 쿼리문으로 개념을 확인할 때 Member, Team, Orders 엔티티의 연관관계는 아래와 같이 설정되어 있다고 생각하자
@Entity
@Table(name = "MEMBERS")
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
private int age;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int orderAmount;
@Embedded
private Address address;
@ManyToOne
@JoinColumn(name = "PRODUCT_ID")
private Product product;
}
경로 표현식 용어 정리
- 상태 필드(state field): 단순히 값을 저장하기 위한 필드이다.
- 연관 필드: 연관관계를 나타내기 위한 필드이다.
- 단일 값 연관 필드 : @ManyToOne, @OneToOne, 타겟 대상이 엔티티일 때
- 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 타겟 대상이 컬렉션인 경우
경로 표현식 특징
- 상태 필드(state field)
- 경로 탐색의 끝이다. 더 이상 탐색이 안된다.
- ex) m.username
- 단일 값 연관 경로
- 묵시적 내부 조인(inner join)이 발생한다.(JPQL로 날리지만 실제 쿼리는 조인을 하고있음)
- 상태 필드가 되기 전까지 탐색이 더 가능하다.
- ex) m.team
- Member와 Team을 inner join을 하고 select에 team에 관한 컬럼을 나열한다.
- 컬렉션 값 연관 경로
- 묵시적 내부 조인이 발생하고, 더 이상 탐색이 안된다.
- ex) m.orders
- 1:N 관계이기 때문에 데이터가 여러 개가 있어서 어떤 데이터의 필드를 가져와야 하는지 애매하기 때문에 해당 부분은 제한이 걸려있어 더 이상 탐색이 불가능하다.
- FROM 절에서 명시적 조인을 통해 별칭을 얻으면 별칭을 통해 탐색이 가능하다.(select m from Team t join t.member m)
참고)
묵시적 내부 조인이 발생하지 않도록 주의하자! 성능 이슈가 생길 수 있다.
추후에 쿼리 튜닝도 어렵고 문제점이 발생하면 찾기가 어렵다. 명시적 조인을 사용하자!
명시적 조인은 JOIN 키워드를 직접 사용하는 것이고(ex. select m from Member m join m.team t)
묵시적 조인은 경로 표현식에 의해 묵시적으로 SQL 조인이 발생하는 것이다. (내부 조인만 가능)
(ex. select m.team from Member m)
상태 필드 경로 탐색
JPQL : select m.username, m.age from Member m
SQL : select m.username, m.age from Member m
단일 값 연관 경로 탐색
JPQL : select o.member from Order o
SQL : select m.* from Orders o inner join Member m on o.member_id = m.id
경로 탐색을 사용한 묵시적 조인 시 주의사항
항상 내부 조인이 발생한다.
컬렉션은 경로 탐색의 끝, 명시적 조인을 통해 별칭을 얻어야 한다.
경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM(JOIN) 절에 영향을 준다.
728x90
반응형
'TIL > JPA' 카테고리의 다른 글
[TIL/JPA] 기본개념 : 다형성 쿼리 (0) | 2024.09.15 |
---|---|
[TIL/JPA] 기본개념 : 페치 조인(fetch join) (0) | 2024.09.11 |
[TIL/JPA] 기본개념 : JPQL(Java Persistence Query Language) (0) | 2024.09.09 |
[TIL/JPA] 기본개념 : JPA의 다양한 쿼리 방법 소개 (0) | 2024.09.04 |
[TIL/JPA] 기본개념 : 값 타입 (0) | 2024.08.31 |