JPA-JPQL fetch join

드라카·2023년 1월 4일
0

실무 환경에서 연관관계 엔티티의 경우 성능상의 이슈를 방지 하기 위해 기본적으로 LAZY 모드로 FetchType 을 설정하게 된다.

이럴 경우 JPQL 에서 LAZY 모드에 우선시 하여 연결된 엔티티(@ManyToOne) 또는 엔티티 컬렉션 (@OneToMany) 을 한번에 가져오고자 할때 fetch join을 사용한다.

JPQL 쿼리 구문은 아래와 같다.

SELECT c FROM Customer c LEFT JOIN FETCH c.orders WHERE c.id = :customerId

Fetch Join을 사용할 경우 Customer 와 Orders 가 Left Join 되어 Lazy 모드에 관계 없이 실행되는 순간 영속성 컨텍스트에 저장되어 데이터를 바로 사용 할 수 있게 된다.

패치 조인 특징

  1. fetch join 대상에는 별칭을 줄 수 없다.
    -> 하이버네이트에서는 가능하지만, 데이터 정합성등의 이유로 실무 상황에서는 가급적 사용하면 안됨
  2. 둘 이상의 컬렉션은 fetch join 할 수 없다.
  3. 컬렉션을 fetch join 하면 paging api 를 사용할 수 없다.
    -> 하이버네이트에서 메모리에서 페이징을 실행 하지만 실제로 DB 에 페이징 쿼리가 날아가지 않음 (매우 위험)
profile
삽질의 달인

0개의 댓글