본문 바로가기
JAVA/SpringBoot

[김영한] 자바 ORM 표준 JPA 프로그래밍 - 섹션 8. 즉시로딩과 지연로딩

by 설총이 2023. 10. 31.
프록시와 연관관계 관리 - 즉시로딩과 지연로딩

 

즉시로딩과 지연로딩

(요약)
1. FetchType.EAGER
=> 연관관계에 있는 테이블까지 Join해서 즉시 가져온다.

2. FetchType.LAZY
=> 연관관계에 있는 엔티티는 프록시 객체로 가지고 있다가
부모가 참조하는 자식의 객체를 .getXX를 가져오려고할 때 그때 쿼리가 수행된다.

3. @XXXToOne 은 모두 Default: FetchType.EAGER로 선언되어있다.
 ( @XXXToMany 는 Default: FetchType.LAZY )
=> 모든 연관관계에 지연로딩으로 사용하라!
성능을 위해 연관관계에 있는 객체까지 DB쿼리를 한번에 수행하고자 한다면 fetch join이나 엔티티 그래프를 사용하라

 

지연로딩

 

즉시로딩

 

- 주의사항

 

소스코드 예제

==> JPQL에서 N+1문제를 발생하는 요인
어플리케이션 로직으로 보면 Member만 조회하는 쿼리수행문을 만들었는데
1. Team에 대한 JPA 즉시로딩전략으로 Member에 해당하는 Team 또한 셋팅해야하기때문에
실제로 나가는 DB쿼리는 member에 해당하는 모든 Team을 조회하는 케이스가 발생하게된다.
Team 안에도 다른 연관관계 엔티티가 더 있다면?....

2. 다수의 Join을 사용하고 있다고 확인 요청이 들어왔을 때 1번에 대해 모르고 쓰면 개발자는 소스코드에서 이해할 수 없어 문제 해결에 장애가 발생할 수 있다.

===> 모든 연관관계에 지연로딩으로 사용하라!