우리는 Calisthenics 입니다!
JPA Fetch 전략 본문
Fetch Type
JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값
- Eager : 연관 관계에 있는 Entity들을 모두 가져온다.
- Lazy : 연관 관계에 있는 Entity를 가져오지 않고, getter로 접근할 때 가져온다.
N+1 문제
@ManyToOne, @OneToOne의 FetchType을 LAZY로 했을 때 발생
→ DB에 상당한 부하를 일으키게 된다.
N+1 문제 해결 방법
join fetch 사용
- inner join
- 불필요한 쿼리문이 추가되는 단점이 있다.
@EntityGraph 사용
outer join → Cartesian Product ⇒ 중복이 발생한다.
→ 해결 방법
- 1:n 필드의 타입을 Set으로 선언한다. → LinkedHashSet을 사용하여 순서 보장, 중복 제거
- 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 |
---|