개요
현재 프로젝트 내 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
@EntityGraphType 어노테이션 또한 알아두면 N + 1 문제를 해결할 수 있다고 하니 숙지해야겠습니다.
참고
인프런 강의 - 스프링과 JPA 기반 웹 애플리케이션 개발 (백기선 강사님)
반응형
'[DEV] 기록' 카테고리의 다른 글
[SpringBoot] 여러 파일을 .zip 파일로 압축해서 다운로드 (0) | 2022.04.12 |
---|---|
[Java] File을 MultipartFile로 변환하는 함수 (0) | 2022.04.12 |
[SpringBoot] git에 application.properties 안 올리는 방법 (0) | 2022.04.10 |
[PostgreSQL] PostgreSQL 비밀번호 잊어버렸을 경우 (0) | 2022.04.09 |
[SpringBoot + jQuery] 파일 다운로드 기능 구현 (0) | 2022.04.08 |