Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

우리는 Calisthenics 입니다!

JPA Fetch 전략 본문

Backend/JPA

JPA Fetch 전략

yesforlog 2021. 8. 3. 20:37

Fetch Type

JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값

  • Eager : 연관 관계에 있는 Entity들을 모두 가져온다.
  • Lazy : 연관 관계에 있는 Entity를 가져오지 않고, getter로 접근할 때 가져온다.

N+1 문제

@ManyToOne, @OneToOne의 FetchType을 LAZY로 했을 때 발생

→ DB에 상당한 부하를 일으키게 된다.

N+1 문제 해결 방법

  1. join fetch 사용

    • inner join
    • 불필요한 쿼리문이 추가되는 단점이 있다.
  2. @EntityGraph 사용

    • outer join → Cartesian Product ⇒ 중복이 발생한다.

      → 해결 방법

      1. 1:n 필드의 타입을 Set으로 선언한다. → LinkedHashSet을 사용하여 순서 보장, 중복 제거
      2. query에 distinct를 사용하여 중복 제거
    • attributePaths에 query 수행시 바로 가져올 필드명을 지정하면 Eager 조회로 가져온다.

글로벌 fetch 기본 전략

@OneToOne, @ManyToOne : Eager

@OneToMany, @ManyToMany : Lazy

  • 즉시 로딩이 필요하지 않은 1:1, n:1 연관관계에서는 LAZY로 설정하여 불필요한 query 실행을 방지할 수 있다.

참고 자료

'Backend > JPA' 카테고리의 다른 글

프로젝트를 위한 JPA 공부 정리  (0) 2021.07.29