지연 로딩 : 엔티티를 조회할 때, 연관된 엔티티를 바로 불러오는 것이 아니라, 실제로 불러와야 되는 시점에 불러오는 방식입니다.
- 장점 : 불필요한 데이터는 불러오지 않기 때문에, 성능 향상과 메모리 절약이 됩니다.
- 단점 : 이거 로딩보다 비교적 N+1 문제가 잦게 발생합니다.
- 지연 로딩을 사용하는 경우, 어떤 시점에 쿼리가 발생할지 예측하기 어렵습니다. 연관된 엔티티에 접근할 때마다 쿼리가 실행되기 때문에, 성능 문제를 디버깅하거나 최적화할 때 어려움이 있을 수 있습니다.
즉시 로딩 : 엔티티를 조회할 때, 연관된 모든 엔티티들을 함께 불러옵니다.
- 장점 : 한번에 다 불러오기 때문에, 알맞은 상황에서는 레이지 로딩보다 비교적 빠르고 간단하게 조회할 수 있습니다.
- 단점 : 모든 데이터를 불러와서 사용하는 경우가 아닌 이상, 불필요한 데이터들을 불러와서 메모리 낭비 발생합니다. 너무 많은 데이터를 불러오는 경우, 응답 시간도 느려질 수 있습니다.
개인적으로는 지연 로딩을 기본으로 쓰고, N+1문제를 해결하는 방식이 더 유연하고 좋은 것 같다.
EAGER Loading을 사용해서는 안되는 이유
어떤 Entity 연관관계 범위까지 Join쿼리로 조회 해올지 예상하기가 힘들어지기 때문에 오히려 필요없는 데이터까지 로딩하여 비효율적일 수 있어 N+1문제를 해결하는 방법으로는 적합하지 않습니다.
===============
GPT
좋은 질문입니다! Lazy Loading과 Eager Loading은 JPA에서 엔티티 연관 관계를 가져올 때 데이터를 어떻게 로드할지 결정하는 방식입니다. 각각의 차이점과 장단점을 설명할게요.
Lazy Loading
- 개념: 엔티티를 조회할 때 연관된 엔티티는 처음에는 로드하지 않고, 실제로 필요한 시점에 로드합니다.
- 장점:
- 초기 성능 향상: 연관된 데이터를 미리 로드하지 않기 때문에 처음에 필요한 데이터만 가져와서 성능을 최적화할 수 있습니다.
- 메모리 절약: 불필요한 데이터를 로드하지 않기 때문에 메모리 사용량이 줄어듭니다.
- 단점:
- N+1 문제 발생 가능: 연관된 엔티티를 반복적으로 호출하게 되면 쿼리가 여러 번 발생할 수 있어 성능 저하가 생길 수 있습니다.
- 프록시 객체 사용: 실제 데이터를 사용할 때만 로드되므로, 프록시 객체로 인해 예기치 않은 동작이 발생할 수 있습니다. 특히, 트랜잭션이 종료된 후에 프록시 객체에 접근하면 LazyInitializationException이 발생할 수 있습니다.
Eager Loading
- 개념: 엔티티를 조회할 때 연관된 엔티티를 즉시 함께 로드합니다.
- 장점:
- 즉시 연관 데이터를 사용할 수 있음: 한 번의 쿼리로 연관된 모든 데이터를 가져오므로 별도의 추가 쿼리가 필요 없습니다.
- 단순한 사용: 연관된 데이터를 미리 로드하기 때문에, 트랜잭션이 종료된 후에도 안전하게 사용할 수 있습니다.
- 단점:
- 불필요한 데이터 로드: 실제로 사용하지 않는 데이터까지 로드되기 때문에 메모리 낭비가 발생할 수 있습니다.
- 초기 성능 저하: 처음 데이터를 가져올 때 모든 연관 데이터를 로드하므로, 많은 데이터가 한 번에 로드되면 성능이 저하될 수 있습니다.
정리
- Lazy Loading은 필요한 시점에 데이터를 로드하여 성능을 향상시킬 수 있지만, N+1 문제나 LazyInitializationException과 같은 문제를 주의해야 합니다.
- Eager Loading은 데이터를 미리 로드하여 사용할 수 있지만, 불필요한 데이터를 모두 로드하기 때문에 성능에 악영향을 미칠 수 있습니다.
Lazy와 Eager 로딩 중 어떤 것을 사용할지는 상황에 따라 다르며, 데이터 사용 패턴과 성능 최적화를 고려해 결정해야 합니다냥!