일반 조인 : 일반적인 SQL 조인을 의미(내부 조인
, 외부 조인
, 컬렉션 조인
, 세타 조인
)
패치 조인 : JPQL 안에서 성능 최적화를 위해 제공하는 기능으로 연관된 엔티티나 컬렉션을 한 번에 조회할 수 있다.
지연 로딩이 아닌 즉시 로딩을 수행하며 join fetch
명령어를 사용한다.
연관관계가 설정된 상태에서 테스트한다.
Menu 엔티티에 대한 조회만 일어나고 Category 엔티티에 대한 조회는 나중에 필요할 때 일어난다.(지연로딩
)
select의 대상은 영속화하여 가져오지만 조인의 대상은 영속화하여 가져오지 않는다.
컬렉션 조인은 의미상 분류된 것으로 컬렉션을 지니고 있는 엔티티를 기준으로 조인하는 것을 말한다.
@Test
public void 컬렉션조인을_이용한_조회_테스트() {
/* 컬렉션 조인은 의미상 분류된 것으로 컬렉션을 지니고 있는 엔티티를 기준으로 조인하는 것을 말한다. */
//when
String jpql = "SELECT c.categoryName, m.menuName FROM section06_category c LEFT JOIN c.menuList m";
//JOIN c.menuList -> category class가 가진 필드
List<Object[]> categoryList = entityManager.createQuery(jpql, Object[].class).getResultList();
//then
assertNotNull(categoryList);
categoryList.forEach(row -> {
Stream.of(row).forEach(col -> System.out.print(col + " "));
System.out.println();
});
}
세타 조인은 조인되는 모든 경우의 수를 다 반환하는 크로스 조인과 같다.
페치 조인을 하면 처음 SQL 실행 후 로딩할 때 조인 결과를 다 조회한 후 뒤에 사용하는 방식이기 때문에 쿼리 실행 횟수가 줄어들게 된다.(지연로딩X
)
대부분의 경우 성능이 향상된다.
String jpql = "SELECT m FROM section06_menu m JOIN FETCH m.category c";