본문 바로가기

스터디/JPA

객체지향 쿼리 언어 - (4)

728x90
반응형

JPQL - (3)


페치 조인

JPQL에서 성능 최적화를 위해 제공하는 기능이다

연관된 엔티티나 컬렉션을 한 번에 같이 조회하는 기능으로 join fetch 명령어로 사용할 수 있다

 

엔티티 페치 조인

 

select m
from Member m join fetch m.team

회원과 팀을 함께 조회한다

팀이 프록시가 아닌 실제 엔티티이므로 연관된 팀을 사용해도 지연 로딩이 일어나지 않는다

 

 

컬렉션 페치 조인

 

select t
from Team t join fetch t.members
where t.name = '팀A'

팀을 조회하면서 페치 조인을 사용해 연관된 회원 컬렉션도 함께 조회한다

위의 JPQL 결과는 List<Team> 형태이다

 

같은 팀A가 회원 수 만큼 조회된다

 

 

페치 조인과 DISTINCT

 

DISTINCT중복된 결과를 제거하는 명령이다

JPQL에서 DISTINCT는 SQL에서 중복을 제거할 뿐만 아니라 애플리케이션에서 한 번 더 중복을 제거한다

select distinct t
from Team t join fetch t.members
where t.name = '팀A'

 

SQL상에서는 같은 팀이더라도 각 로우의 데이터가 다르므로 distinct의 효과가 없다

애플리케이션 상에서 중복된 팀 엔티티를 제거해 팀A는 하나만 조회된다

 

 

페치 조인과 일반 조인의 차이

 

JPQL은 결과를 반환할 때 연관관계를 고려하지 않는다

select 절에서 지정한 엔티티만 조회한다

 

지연 로딩 시 프록시나 아직 초기화되지 않은 컬렉션 래퍼를 반환한다

즉시 로딩 시 회원 컬렉션을 즉시 로딩하기 위한 쿼리를 한 번 더 실행한다

페치 조인 시 연관된 엔티티도 한번에 조회한다

 

 

페치 조인의 특징

 

페치 조인을 사용하면 SQL 한 번으로 연관된 엔티티들을 함께 조회할 수 있어 SQL 호출 횟수를 줄여 성능을 최적화할 수 있다

 

글로벌 로딩 전략보다 우선한다

글로벌 로딩 전략이 지연 로딩이더라도 JPQL에서 페치 조인을 사용하면 페치 조인이 적용된다

 

글로벌 로딩 전략은 지연 로딩으로 하고 필요한 부분에만 페치 조인을 사용하는 것이 효과적이다

 

 

페치 조인의 한계

 

페치 조인 대상에는 별칭을 줄 수 없다

select, where 절, 서브 쿼리에 페치 조인 대상을 사용할 수 없다

 

둘 이상의 컬렉션을 페치할 수 없다

컬렉션 * 컬렉션 만큼의 데이터가 생성되므로 조심해야 한다

 

컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다

컬렉션이 아닌 단일 값 연관 필드일 경우에는 사용해도 된다

컬렉션을 페치 조인하고 페이징 API를 사용하는 경우 메모리에서 페이징 처리를 하는데 성능 이슈와 메모리 초과 이슈가 발생할 수 있다

 

 

페치 조인은 객체 그래프를 유지할 때 사용하면 효과적이다

 

여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 한다면 페치 조인 대신 필요하 필드만 조회해 DTO로 반환하는 것이 더 효과적일 수 있다

728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

객체지향 쿼리 언어 - (6)  (0) 2025.02.19
객체지향 쿼리 언어 - (5)  (0) 2025.02.18
객체지향 쿼리 언어 - (3)  (0) 2025.02.17
객체지향 쿼리 언어 - (2)  (0) 2025.02.17
객체지향 쿼리 언어 - (1)  (0) 2025.02.16