jiny

[DATA JPA] @EntityGraph 지연로딩 해결 - 연관된 엔티티들을 같이 조회하기 본문

서버/JPA

[DATA JPA] @EntityGraph 지연로딩 해결 - 연관된 엔티티들을 같이 조회하기

ongjiny 2023. 2. 28. 18:21

EntityGraph 는 JPQL을 사용하지 않고 페치 조인을 사용하는 기능이다

우선 Member 와 Team 이 다대일 관계이고, Member 에서 Team이 지연로딩 관계로 설정된 상황일 때

findAll() 메소드 호출 시, 멤버들을 모두 조회하기 위한 쿼리가 한번 나가고 

for 문에서 각 멤버마다 속한 팀의 이름을 호출할 때 마다 team을 찾기 위한 쿼리가 추가로 나간다 

1+N 문제 발생

 

1+N 문제가 발생하며, 연관된 엔티티를 한번에 조회하려면 아래처럼 페치조인이 필요하다

페치조인

 

@EntityGraph 사용하기

JPQL을 사용하지 않고 아래처럼 엔티티 그래프 기능을 사용하여 페치 조인을 사용할 수 있다.

- attributePaths 에 스트링 배열 형태로 연관된 엔티티 변수명을 적어준다

 

data-jpa에서 기본으로 제공하는 findAll() 메소드를 오버라이드해서 사용도 가능하다

기본메소드에서 연관된 엔티티 조회

 

JPQL과 같이 사용해도 상관은 없다

JPQL+엔티티 그래프 사용

다시 findAll 을 사용하여 쿼리를 확인하면

LEFT OUTER JOIN 을 사용하여 멤버를 기본적으로 모두 조회하면서

연관된 Team가 존재하면 같이 불러오고 있다.

 

 

NamedEntityGraph

NamedQuery 처럼 도메인 엔티티에 함께 불러올 엔티티를 이름과 함께 지정하여

리포지토리에서 선택하여 불러올 수 있다.

findMemberEntityGraph() 를 호출하면 Member.all 값을 이용하여

Member 엔티티에서 동일한 Member.all 값을 찾아 페치조인을 실행한다.

 

[출처]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard