준영속 상태의 지연로딩을 해결하는 법

Astin·2024년 2월 28일
0

오늘은 또다른 개선방안에 대해서 살펴볼 예정이다.

저번 포스트를 보지않았다면 아래를 참고하자

[Error] unable to evaluate the expression method threw 'org.hibernate.LazyInitializationException' 해결

https://velog.io/@blacknwhites/Error-unable-to-evaluate-the-expression-method-threw-org.hibernate.lazyinitia

1. fetch Join

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();

2. @EntityGraph

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를 적용하는 것이 오히려 처리시간을 증가시키는 경우가 있으므로 상황에 맞게 사용할 필요가 있다.

🎁 참고

https://velog.io/@sweet_sumin/JPA-N1-%EC%9D%B4%EC%8A%88%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%ED%95%B4%EA%B2%B0%EC%B1%85%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94

https://woo-chang.tistory.com/38

https://itmoon.tistory.com/77

https://wonin.tistory.com/496

0개의 댓글

관련 채용 정보