★ 실무에서 어마어마어마 중요하다고 함. 이거를 모르면 실무를 못한다고..
SQL 조인 종류 X
JPQL에서 성능 최적화를 위해 제공하는 전용 기능
연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능
>> 쿼리 2번 나갈것을 한 방 쿼리로 끝내는 어마어마한 기술
>> 실무에서 엄청 많이 사용
JOIN FETCH 명령어 사용
페치조인 ::= [LEFT[OUTER] | INNER] JOIN FETCH 조인경로
엔티티 페치 조인
[JPQL]
select m from Member m join fetch m.team
>>[해석] Member를 조회 할껀데, (fetch:한번에 가져온다) join해서 한번에 가지고 오라
그러면서 team을 가지고 와
[SQL]
SELECT M.*,T.* FROM MEMBER M
INNER JOIN TEAM T ON M.TEAM_ID=T.ID
컬렉션 페치 조인
일대다 관계
[JPQL]
select t
from Team t join fetch t.members
where t.name = '팀A'
[SQL]
SELECT T.*,M.*
FROM TEAM T
INNER JOIN MEMBER M ON T.ID=M.TEAM_ID
WHERE T.NAME ='팀A'
JPQL의 DISTINCT 2가지 기능
1. SQL에 DISTINCT를 추가
2. 애플리케이션에서 엔티티 중복 제거
일대다 일 경우에는, 데이터가 뻥튀기가 되기 때문에 조심해야합니다.
페치 조인과 일반 조인의 차이
>> 일반 조인 실행시 연관된 엔티티를 함께 조회하지 않음
특징과 한계
페치 조인 대상에는 별칭을 줄 수 없다
- 하이버네이트 가능, 가급적 사용X
>> 페치조인은 기본적으로 나랑 연관된 모든것을 다 끌거 오는거이기에,
특정 대상만 주면 오류가 발생할 수 있음
둘 이상의 컬렉션은 페치 조인 할수 없다.
일대다도 데이터가 뻥튀기가 되는데, 이거는 곱하기 * 곱하기 이기에
데이터 정합성의 문제가 발생될 수 있으니 쓰지말자
컬렉션을 페치 조인하면 페이징 API(setFirstResult,setMaxResults)를 사용할 수 없다.
- 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능
- 하이버네이트 경고 로그를 남기고 메모리에서 페징(매우 위험)
<실무 팁 >> 실무에서는 글로벌 세팅을 사용한다.
persistance.xml에 추가
"hibernate.default_batch_fetch_size" value ="100"
>>> batch_fetch_size 를 사용하면 쿼리를 N + 1이 아니라 테이블 수 만큼
맞출수 있다.
1.연관된 엔티티들을 SQL 한 번으로 조회 - 성능 최적화
2. 엔티티에 직접 적용하는 글로벌 로딩 전략보다 우선함
@OneToMany(fetch = FetchType.LAZY) //글로벌 로딩 전략
3.실무에서 글로벌 로딩 전략은 모두 지연 로딩
4.최적화가 필요한 곳은 페치 조인 적용
>>> JPA 70~80% 문제는 N +1 문제인데, 거의 페치 조인으로 해결할 수 있다.
너무 중요하기에 페치 조인은 100% 꼭 이해하자. 운영 할 때 성능상 큰 이점.
[출처- 인프런 김영한 '자바 ORM 표준 JPA 프로그래밍- 기본편] 강의듣고 정리