어쨋든 JPA에서 많이 얘기가 나오고 다루는 N+1의문제.
@XtoOne(fetch=LAZY)
일반 조인은 기본적으로 지연 로딩이기 때문에 연관된 엔티티를 함께 조회하지 않는다.
일반 조인 > SELECT 절에 지정한 엔티티만 조회한다.
패치 조인> 객체 그래프를 SQL 한 번에 조회하는 개념
-객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.
-'.'을 찍어서 연관된 객체를 탐색하는 것을 객체 그래프 탐색이라 한다.
-객체 그래프 탐색은 처음 실행하는 SQL에 따라 탐색 범위 결정
-보통 SQL에서 사용하는 조인이 아니다.
-JPQL 에서 성능 최적화를 위해 제공하는 기능이다.
-연관된 엔티티나 컬렉션을 SQL 한번에 함께 조회하는 것
-join fetch 명령어를 사용한다.
*엔터티 패치 조인
SELECT m FROM Member m join fetch m.team SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID=T.ID*컬렉션 패치 조인
select t from Team t join fetch t.members select T.*, M.* from TEAM T inner join MEMBER M ON T.ID=M.TEAM_ID- =결과가 중복되는 것을 막기위해 SQL과 JPQL은 DISTINCT를 제공한다. (모든 속성 값이 같아야 중복이 제거됨) JPQL은 어플리케이션 레벨에서 엔티티의 중복 제거를 함께 해준다.패치 조인은 기본적으로 모든 연관 그래프를 가지고 온다는 개념이다.
패치 조인 대상에는 별칭을 줄 수 없다. (where m.~ 이런 것 쓰면 안 됨)
둘 이상의 컬렉션은 패치 조인 할 수 없다.
컬렉션을 패치 조인하면 페이징 API를 사용할 수 없다.