시냅스

JPA JPQL 경로 표현식과 패치 조인 본문

Java, Spring/JPA

JPA JPQL 경로 표현식과 패치 조인

ted k 2022. 9. 17. 15:30

경로 표현식

  • .(점) 을 찍어 객체 그래프를 탐색하는 것
select m.username // 상태 필드
from Member m
join m.team t // 단일 값 연관 필드
join m.orders o // 컬렉션 값 연관 필드
where t.name = '팀A'
  • 상태 필드 state field 
    • 단순히 값을 저장하기 위한 필드
  • 연관 필드 association field 
    • 연관관계를 위한 필드
    • 단일 값 연관 필드
      • @ManyToOne, @OneToOne
      • 대상이 엔티티
      • 묵시적 내부 조인 발생, 탐색이 가능하다.
      • select m.team from member m 에서 m.team.name으로 갈 수 있음
    • 컬렉션 값 연관 필드
      • @OneToMany, @ManyToMany
      • 대상이 컬렉션
  • 명시적 조인
    • join 키워드 직접 사용
    • select m from Member m join m.team t
  • 묵시적 조인
    • 경로 표현식에 의해 묵시적으로 Sql 조인 발생 (내부 조인만 가능)
    • select m.team from Member m
    • 사용이 권장되지 않는다.
    • 컬렉션은 경로 탐색의 끝, 명시적 조인을 통해 별칭을 얻어야한다.
    • 경로 탐색은 주로 select, where 절에서 사용하지만 묵시적 조인으로 인해 sql from(join) 절에 영향을 줌

 

패치 조인 Fetch Join

  • JPQL에서 성능 최적화를 위해 제공하는 기능
    • N + 1 문제를 피한다.
  • 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회 하는 기능
  • join fetch 명령어 사용
  • 회원을 조회하면서 연관된 팀도 함께 조회
  • jpql
    • select m from Member m join fetch m.team
  • sql
    • select M.*, T.* from member m inner join team t on m.team_id = t.id
  • 지연로딩을 셋팅해도 패치 조인의 우선권이 더 높다.
  • 일반 조인은 실행시 연관된 엔티티를 함께 조회하지 않는다.
  • 패치 조인은 즉시로딩 상태로 만든다.
    • 객체 그래프를 SQL 한 번에 조회하는 개념

 

패치 조인의 한계

  • 패치 조인 대상에는 별칭을 줄 수 없다.
  • 둘 이상의 컬렉션은 페치 조인 할 수 없다.
  • 컬렉션을 페치 조인하면 페이징 API를 사용할 수 없다.
    • 일대일, 다대일 같은 단일 값 연관 필드들은 페치 조인해도 페이징 가능
    • 하이버네이트는 경고 로그를 남기고 메모리에서 페이징
  • 여러 테이블을 조인해서 엔티티가 가진 모양이 아닌 전혀 다른 결과를 내야 하면, 페치 조인 보다는 일반 조인을 사용하고 필요 한 데이터들만 조회해서 DTO로 반환하는 것이 효과적

 

Comments