지연로딩 ( FetchType.LAZY)
Member 에 Team 을 매핑했을 경우, 지연로딩을 사용하게 되면 최초 조회시 프록시 객체로 호출하게 된다.
그리고 실제 그 프록시 객체의 메소드를 사용하는 시점에 DB로 부터 초기화를 진행한다.
이로인해 쿼리가 단순해지고 네트워크상의 이점이 있다.
[ Member를 단독적으로 사용하려고 할 때, Team 쿼리가 따로 나가지 않음 ]
@OneToMany, @ManyToMany // Default = LAZY
EX ] Member 를 로딩할 때, Member에 걸려있는 Team은 지연로딩. 즉 Proxy 엔티티로 호출되면 나중에 직접적인
접근이 필요할 때 DB에 초기화를 요청하여 진짜 엔티티를 가져온다.
즉시로딩 ( FetchType.EAGER)
Member 에 Team 을 매핑했을 경우, 즉시로딩을 사용면 프록시 객체를 생성하지 않고 바로 실제 엔티티들을 즉시 로딩한다.
@ManyToOne, @OneToOne // Default = LAZY
EX ] Member 를 로딩할 때, Member에 걸려있는 Team이 즉시로딩 이라면 Member 를 호출할 때 Team 엔티티도 즉시 가져온다.
주의점
가급적이면 지연 로딩만 사용을 하자!
대신 JPQL fetch 조인, 엔티티 그래프 기능을 사용한다.
- 즉시 로딩을 적용하면 예상치 못한 Join SQL 들이 발생한다. 특히 DB 의 규모가 커질수록 성능이 저하된다.
- 즉시 로딩은 JPQL 에서 N+1 문제를 발생시킨다.
최초의 쿼리 [ 1 ] + 그에 엮여있는 수 많은 쿼리들 [ N ]
'JPA with 김영한' 카테고리의 다른 글
JPQL (0) | 2021.09.27 |
---|---|
영속성 전이와 고아객체 (0) | 2021.09.13 |
프록시(Proxy) (0) | 2021.09.09 |
상속관계의 매핑 (0) | 2021.09.08 |
다양한 연관관계 매핑 (0) | 2021.09.05 |