Lazy Loading과 Eager Loading

꽃봉우리·2024년 7월 2일

Lazy Loading (지연 로딩)

Lazy Loading은 연관된 엔티티를 실제로 필요할 때까지 로드하지 않는 전략이다. 즉, 연관된 엔티티에 접근할 때 해당 데이터를 데이터베이스에서 가져온다.

특징

  • 지연 로딩을 위한 프록시 사용: JPA는 연관된 엔티티에 대한 프록시 객체를 생성하고, 실제 데이터에 접근할 때 데이터베이스에서 데이터를 가져온다.

  • 성능 최적화: 필요할 때만 데이터를 로드하므로 초기 로딩 시 성능이 향상될 수 있다. 대규모 데이터셋에서 유용하다.

  • N+1 문제 발생 가능성: 부모 엔티티를 조회한 후 각 자식 엔티티에 접근할 때 추가 쿼리가 발생할 수 있다.

여기서 User 엔티티의 posts 컬렉션은 Lazy 로딩된다. User 엔티티를 조회할 때 posts 컬렉션은 로드되지 않고, posts에 접근하는 시점에 데이터베이스 쿼리가 실행된다.

Eager Loading (즉시 로딩)

Eager Loading은 엔티티를 조회할 때 연관된 엔티티를 즉시 함께 로드하는 전략이다. 즉, 부모 엔티티를 조회할 때 자식 엔티티도 즉시 로드된다.

특징

  • 즉시 로딩: 부모 엔티티를 로드할 때 연관된 모든 엔티티를 함께 로드한다.

  • 쿼리 수 감소: 초기 로딩 시 한 번의 쿼리로 연관된 데이터를 모두 가져오므로 N+1 문제를 피할 수 있다.

  • 초기 성능 부하 증가: 초기 로딩 시 모든 연관 데이터를 로드하므로 불필요한 데이터를 미리 로드하여 성능이 저하될 수 있다.

여기서 User 엔티티의 posts 컬렉션은 Eager 로딩된다. User 엔티티를 조회할 때 posts 컬렉션도 함께 로드된다.

비교

  • 로딩 시점: Lazy Loading은 실제 데이터에 접근할 때 로드되며, Eager Loading은 엔티티를 조회할 때 즉시 로드된다.

  • 쿼리 수: Lazy Loading은 여러 쿼리가 발생할 수 있으며, Eager Loading은 한 번의 쿼리로 모든 데이터를 로드한다.

  • 성능: Lazy Loading은 초기 로딩 성능이 좋지만, 필요할 때마다 쿼리를 실행하여 N+1 문제가 발생할 수 있다. Eager Loading은 초기 로딩 시 성능 부하가 크지만, 추가적인 쿼리가 적다.

  • 메모리 사용: Lazy Loading은 필요한 데이터만 로드하므로 메모리 사용이 적을 수 있고, Eager Loading은 불필요한 데이터를 함께 로드하여 메모리 사용이 많아질 수 있다.

결론

Lazy Loading은 대규모 데이터셋에서 필요한 데이터만 로드하여 메모리 사용을 줄이는 데 유리합니다. 하지만 N+1 문제를 주의해야 한다.

Eager Loading은 데이터 접근 패턴이 예측 가능하고 연관된 데이터를 한 번에 로드하는 것이 효율적일 때 유용하다. 그러나 초기 로딩 시 성능 부하가 증가할 수 있다.

0개의 댓글