
Lazy Loading과 Eager Loading은 엔티티와 연관된 데이터의 로딩 방식을 결정하는 전략이다.
데이터를 실제로 필요할 때까지 로드하지 않고, 연관된 엔티티를 지연 로딩하는 방식이다.
기본적으로 프록시 객체를 사용해 필요할 때 데이터를 로드한다.
장점:
필요하지 않은 데이터를 불러오지 않아 메모리 사용과 성능을 최적화할 수 있다.
초기 로딩 속도가 빠르다.
단점 :
데이터를 사용하려는 시점에서 추가적인 쿼리가 발생할 수 있어 성능 이슈를 초래할 수 있다.
N+1 문제 발생 가능성이 높다.
엔티티가 로드될 때 연관된 모든 데이터를 즉시 로드하는 방식이다.
초기 로딩 시점에서 데이터를 모두 불러오기 때문에 연관된 엔티티를 즉시 사용할 수 있다.
장점 :
단점 :
Lazy Loading은 연관된 데이터가 항상 사용되지 않거나 , 필요할 때만 로드 하는것이 유리한 경우에 적합합니다. 예를 들어서 , 데이터 목록을 조회할 때 연관 된 엔티티의 상세 정보가 필요 없을 경우에 사용합니다.
Eager Loading은 연관된 데이터가 항상 필요하거나, 여러번의 쿼리를 줄여 성능을 최적화하고 싶은 경우에 유용합니다. 예를 들어, 한번의 쿼리로 여러 엔티티의 정보를 함께 불러와야할 때 사용합니다.
N+1 문제는 Lazy Loading으로 인해 하나의 엔티티 조회 후 연관된 N개의 엔티티를 개별적으로 추가 쿼리로 로드 할 때 발생하는 문제입니다. 예를 들어 ,List<Parent>를 조회하고 각 Parent에 속한 child 엔티티들을 Lazy Loading 할 경우 1+N개의 쿼리가 발생합니다.
이를 해결하는 방법으로는 @EntityGraph를 사용하거나 fetch join을 사용하는 방법이 있습니다. 이를 통해서 연관된 데이터를 한번의 쿼리로 가져올 수 있습니다.
@OneToOne과 @ManyToOne 연관 관계는 Eager Loading으로 설정되고, @OneToMany와 @ManyToMany 연관 관계는 Lazy Loading으로 설정됩니다. 이는 연관된 데이터의 양에 따라 성능을 고려한 기본 설정입니다.