[DEV] 기록

[SpringBoot + JPA] @NamedEntityGraph

꾸준함. 2022. 4. 10. 23:58

개요

현재 프로젝트 내 JPA 글로벌 Fetch 타입은 Lazy이지만 특정 페이지에서는 연관관계가 있는 객체들을 모두 불러와야 하는 경우가 있어 Lazy Loading으로 N번 쿼리를 호출하는 것보다 한 번에 가져오는 것이 성능이 좋을 것이라고 판단했습니다.

찾아본 결과 @NamedEntityGraph 어노테이션을 사용하면 특정 JPA 쿼리에 대해 커스텀 Fetch 타입을 정의할 수 있다는 것을 알았고 저는 위 문제를 해당 어노테이션을 통해 해결했습니다.

 

예제

 

Example.class

 

 

  • Example.class와 연관된 엔티티가 3개 있다고 가정
  • @OneToMany, @ManyToMany 연관관계는 디폴트 Fetch 타입이 Lazy
  • 특정 페이지에서는 해당 엔티티들의 정보가 모두 필요하므로 Lazy Loading을 통해 여러 번 쿼리를 호출하는 것보다 Join을 통해 쿼리 한 번으로 호출하는 것이 트래픽 측면에서 유리
  • 이를 위해 @NamedEntityGraph 어노테이션을 선언하고 JpaRepository를 상속받은 Repository 내 원하는 쿼리에 적용하면 원하는 대로 한 번의 쿼리만 호출

 

ExampleRepository.class

 

 

 

* EntityGraphType을 Load로 줄 것!

 

비고

앞선 JPA 포스팅에서 N + 1 문제와 함께 해결책으로 @BatchSize 어노테이션을 소개했었습니다.

https://jaimemin.tistory.com/1998

 

[JPA] JPQL 추가 정리

개요 지난 게시글(https://jaimemin.tistory.com/1997)에 이어 아래의 JPQL 개념에 대해 정리해보겠습니다. 경로 표현식 Fetch Join 엔티티 파라미터 Named 쿼리 벌크 연산 1. 경로 표현식 엔티티의 getter와 동일..

jaimemin.tistory.com

 

@EntityGraphType 어노테이션 또한 알아두면 N + 1 문제를 해결할 수 있다고 하니 숙지해야겠습니다.

 

참고

인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발 (백기선 강사님)

 

 

반응형