오늘은 또다른 개선방안에 대해서 살펴볼 예정이다.
저번 포스트를 보지않았다면 아래를 참고하자
[Error] unable to evaluate the expression method threw 'org.hibernate.LazyInitializationException' 해결
JPQL에서 성능 최적화를 위해 제공하는 조인
처음 조회부터 조인시켜 데이터를 가져올 수 있다.
💯 JPQL(Java Persistence Query Language)
- SQL : DB에 있는 테이블 조회
- JPQL : 엔티티 객체를 조회
- 문법은 SQL과 비슷하고 SQL이 제공하는 기능을 유사하게 지원
@Query("select m from Suggestion m left join fetch m.restaurant left join fetch m.user ")
List<Suggestion> findAll();
Data JPA에서 fect 조인을 어노테이션으로 사용할 수 있도록 만들어 준 기능
@EntityGraph(attributePaths = {"user","restaurant"})
List<Suggestion> findAll();
fetch Join과 entityGraph 모두 N+1 문제를 방지할 수 있다는 장점이 있다.
💯 N+1 문제
- 1번 조회해야할 것을 N개 종류의 데이터 각각을 추가로 조회하게 되서 총 N+1번 DB조회를 하게 되는 문제
- 1:N 또는 N:1 관계를 가진 엔티티에서 주로 발생
다만 여러개의 복잡한 연관관계로 이루어져 있을 경우, fetch join 이나 entityGraph를 적용하는 것이 오히려 처리시간을 증가시키는 경우가 있으므로 상황에 맞게 사용할 필요가 있다.