본문 바로가기
JPA with 김영한

즉시로딩 과 지연로딩

by wonseok99 2021. 9. 10.

지연로딩 ( 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 조인, 엔티티 그래프 기능을 사용한다.

  1. 즉시 로딩을 적용하면 예상치 못한 Join SQL 들이 발생한다. 특히 DB 의 규모가 커질수록 성능이 저하된다.
  2. 즉시 로딩은 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