자바 ORM 표준 JPA 프로그래밍 - 기본편을 공부하며 정리한 내용입니다.
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그�
www.inflearn.com
목차
- 경로 표현식
- 페치 조인 1 - 기본
- 페치 조인 2 - 한계
- 다형성 쿼리
- 엔티티 직접 사용
- Named 쿼리
- 벌크 연산
경로 표현식 (실무에서 사용 권장 X)
( 경로 표현식으로 인해 묵시적으로 SQL 조인(내부 조인) 발생) - 나중에 큰 혼란을 줄 수 있음.
경로 표현식이란 ?
.(점)을 찍어 객체 그래프를 탐색하는 것
Member member = new Member();
String name = member.username; // *
용어 정리
- 상태 필드(state field) : 단순히 값을 저장하기 위한 필드 (ex : m.username)
- 연관 필드(association field) : 연관관계를 위한 필드
- 단일 값 연관 필드 : @ManyToOne, @OneToOne, 대상이 엔티티 (ex : m.team)
- 컬렉션 값 연관 필드 : @OneToMany, @ManyToMany, 대상이 컬렉션 (ex : m.orders)
SELECT m.username -> 상태 필드
FROM Member m
join m.team t -> 단일 값 연관 필드
join m.orders o -> 컬렉션 값 연관 필드
WhERE t.name = '팀A'
1. 상태 필드
경로 탐색의 끝 지점. 더 이상의 탐색은 X 불가
select 를 두 번 조회 해서 m.username을 가져왔다.
2. 단일 값 연관 경로
묵시적 내부 조인이 발생(성능에 큰 지장을 준다), 탐색은 m.team.name 이런 식으로 가능.
from 절에 보면, member랑 team이랑 내부 조인이 발생! 한 것을 볼 수가 있다.
객체 입장에서는 .(점)을 이용해 접근하면 되지만, DB입장에서는 join을 통해 가져오는 것이다.
나중에 실무에서 성능 튜닝하는데 있어서 아주 지대한 영향을 주게 된다.
3. 컬렉션 값 연관 경로
묵시적 내부 조인이 발생한다. 컬렉션은 더 이상의 탐색은 불가 X, 한 가지 가능한 점은 t.members.size 컬렉션의 사이즈 정도..
FROM 절에 명시적 조인을 통해 얻은 별칭으로 탐색 가능함. (아래 코드 참조)
FROM 절에서 명시적 조인을 통해 얻은 별칭으로 상태 필드 경로로 탐색하기
이렇게 하면 명시적으로 내부 조인(inner join)을 사용하면 나중에 쿼리 튜닝하기도 쉽고, 묵시적 조인을 사용하게 되면 나중에 운영하는데 큰 애로사항을 줄 수 있다.
결론 : 묵시적 조인을 사용하지 말자.
경로 표현식 예제
select o.member.team from Order o -> O
select t.members from Team t -> O
select t.members.username from Team t -> X
select m.username from Team t join t.members m -> O
JPQL -> SQL
1. 상태 필드 경로 탐색
// JPQL
select m.username, m.age from Member m
// SQL
select m.username, m.age from Member m
2. 단일 값 연관 경로 탐색
// JPQL
select o.member from Order o
// SQL
select m.*
from Orders o
inner join Member m on o.member_id = m.id
정리
- 가급적 묵시적 조인 대신에 명시적 조인 사용
- 묵시적 조인은 항상 내부 조인밖에 안된다.
- 조인은 SQL 튜닝에 중요 포인트이다.
- 경로 탐색은 주로 SELECT, WHERE 절에서 사용하지만 묵시적 조인으로 인해 SQL의 FROM (JOIN) 절에 영향을 줌.
- 묵시적 조인은 조인이 일어나는 상황을 한눈에 파악하기 힘들기 때문에 사용 금지!