JPQL - 조인, 서브쿼리

Growing_HJ·2024년 8월 1일

JPA

목록 보기
13/15

🌟 JPQL 은 결과 반환 시에 연관관계 까지 고려하지 않는다. 단지 SELECT 절에 지정한 엔터티만 조회한다.🌟


📍 1. 내부 조인 📍

내부 조인 사용시에는 INNER JOIN 을 사용하고, INNER 는 생략이 가능하다.

Stirng teamName = "팀A";
Stirng query = "SELECT m FROM Member m INNER JOIN m.team t " + 
"WHERE t.name = "teamName";
  • JPQL 가장 큰 특징은 연관 필드를 사용한다는 것 (m.team)

📍 2. 외부 조인 📍

SELECT m 
FROM Member m LIST [OUTER] JOIN m.team t;
  • Outer 는 생략이 가능해서 보통 LEFT JOIN 으로 많이 사용하한다.

📍 3. 컬렉션 조인 📍

  • 일대다 관계, 다대다 관계 처럼 컬렉션을 사용하는 곳에 조인하는 것을 컬렉션 조인이라 한다.
[회원 -> 팀] 으로의 조인: 다대일 조인이면서 단일 값 연관 필드 (m.team) 을 사용한다 
[팀 -> 회원] 으로의 조인: 일대다 조인이면서 컬렉션 값 연관 필드 (m.members) 를 사용한다. 

CODE)

SELECT t, m FROM Team t LEFT JOIN t.members m
  • 여기서 t LEFT JOIN t.members 는 팀과 팀이 보유한 회원목록을 컬렉션 값 연관 필드로 외부 조인했다.

📍 4. 페치 조인 📍

JPQL 에서 성능 최적화를 위해 제공하는 기능
연관된 엔터티나 컬렉션을 한 번에 같이 조회하는 기능 join fetch 사용

  • 엔티티 페치 조인
    -> 페치 조인을 사용해서 회원 엔티티를 조회하면서 연관된 팀 엔터티도 함께 조회하는 JPQL
    select m FROM Member m join fetch m.team
  • join fetch 를 사용하면 연관된 엔터티나, 컬렉션을 함께 조회한다.
    (회원 (m) 과 팀(m.team) 을 함께 조회한다. 페치 조인은 별칭을 사용할 수 없다.
    페치 조인의 특징과 한계
    1. 페치 조인을 사용하면 SQL 한번으로 연관된 엔터티들을 함께 조회할 수 있어서 SQL 호출 횟수를 줄여 성능 최적화가 가능하다.
    글로벌 로딩 전략 - 엔터티에 직접 적용하는 로딩 전략  
    최적화를 위해 글로벌 로딩 전략을 즉시 로딩으로 설정하면 애플리케이션 전체에서 항상 즉시 로딩이 일어난다.
    물론 일부는 빠를 수 있으나, 전체적으로 봤을때 사용하지 않는 엔터티를 자주 로딩하므로 오히려 성능면으로는 좋지 않은 편.
    따라서 글로벌 로딩 전략 사용시에는 지연 로딩을 사용하고, 최적화가 필요할 경우에는 페치 조인을 적용하는 것이 효과적. 
    2. 페치 조인 대상에는 별칭을 줄 수 없다.
    3. 둘 이상의 컬렉션을 페치할 수 없다.
    4. 컬렉션을 페치 조인할 경우 페이징 API 를 사용할 수 없다.
    5. 페치 조인은 SQL 한번으로 연관된 여러 엔터티를 조회할 수 있기 때문에 성능 최적화에 상당히 유용함.

📍 서브쿼리 📍

서브쿼리 함수

  • [NOT] EXISTS (subquery)
    -> 서브쿼리에 결과가 존재하면 참. NOT 은 반대
  • {ALL | ANY | SOME } (subquery)
    -> 비교 연산자와 같이 사용
    - ALL : 조건을 모두 만족하면 참
    - ANY & SOME : 조건을 하나라도 만족하면 참.
  • [NOT] IN (subqeury)
    -> 서브쿼리의 결과 중 하나라도 같은 것이 있으면 참.

0개의 댓글