JPA
[JPA] Fetch Type
요료료룡
2024. 4. 17. 12:09
Fetch Type이란 JPA가 하나의 Entity를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것이냐를 나타내는 설정값이다.
Fetch Type은 Eager와 Lazy가 있음.
- Eager(즉시로딩)
- 연관관계에 있는 Entity들을 모두 (즉시) 가져온다. (조인을 통해 한 번에 모든 쿼리 가져옴)
- 하이버네이트는 가능하면 SQL 조인을 사용해서 한번에 조회한다.
- @ManyToOne, @OneToOne 의 fetch 타입의 기본값은 FetchType.EAGER
@OneToMany, @ManyToMany 의 fetch 타입의 기본값은 FetchType.LAZY입니다.
즉시로딩을 사용할 때 EAGER 타입으로 변경해 주어야 즉시로딩으로 사용 가능함.
- Lazy(지연로딩)
- 연관관계에 있는 Entity를 가져오지 않고 getter로 접근할 때 가져옴(N+1 Problem이 발생할 수 있음 / 한 번의 쿼리만 날아옴)
- 연관된 엔티티를 프록시로 조회
- 프록시를 실제 사용할 때 초기화하면서 데이터베이스를 조회
→ N+1 문제 : ManyToOne, OneToOne 칼럼의 FetchType을 LAZY로 하였을 경우 발생
주의사항 : 즉시로딩 적용 시, 예상하지 못한 쿼리가 발생할 가능성이 높고, N+1문제를 일으킴.
-> 연관관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수 (N) 만큼 연관관계의 조회 쿼리가 추가로 발생하기 때문에 발생합니다.