반응형
지연로딩(LAZY Loading)이란
: 지연로딩은 연관된 엔티티를 실제로 사용할 때까지 데이터베이스에서 로딩을 지연시키는 기법입니다.
예를 들어 엔티티 A와 B가 일대다 관계를 가지고 있을 때, A 엔티티를 조회하더라도 B 엔티티를 바로 로딩하지 않고, 실제로 B엔티티의 내용이 필요한 시점에 해당 엔티티를 데이터베이스에 가져오는 방식입니다.
지연로딩의 장점 및 사용하는 이유
: 불필요한 데이터를 미리 로딩하지 않아 메모리를 절약하고, 성능 향상을 이룰 수 있습니다.
주의할 점
- 지연로딩을 사용하면서 영속성 컨텍스트가 유지되는 시점에서 연관된 엔티티를 로딩하지 않고 사용하려고 할 때, LazyInitializaionException이 발생할 수 있습니다.
- 영속성 컨텍스트가 사라질 경우, Proxy 엔티티를 사용할 수 없으므로 영속성 컨텍스트가 유지되는 범위에서 사용합니다.
이를 해결하기 위해 영속석 컨텍스트 내에서 해당 엔티티를 미리 로딩하여 에러를 피할 수 있습니다.
get***()함수를 통해 fetch가 LAZY로 설정한 엔티티를 로딩합니다.
Proxy 엔티티란
: Proxy엔티티는 지연로딩을 구현하기 위해 JPA에서 사용하는 기법입니다.
JPA에서는 지연 로딩을 지원하기 위해 실제로 해당 엔티티를 상속한 프록시 클래스를 동적으로 생성합니다. 이 프록시 클래스는 실제 엔티티의 상태를 유지하면서, 실제 사용이 필요한 시점에 데이터베이스를 조회하여 로딩합니다.
예를 들어, 지연로딩으로 설정된 연관 관계를 가진 엔티티 A가 있을 때, A 엔티티를 조회하면 A엔티티 대신 Proxy 엔티티가 반환됩니다. 이 Proxy 엔티티는 실제로 필요한 데이터를 사용할 때까지 데이터베이스 조회를 지연시켜 성능 향상과 메모리 절약을 해줍니다.
개발자는 프록시를 사용하는지 실제 엔티티를 사용하는지 모르고 개발할 수 있습니다.
Proxy 엔티티를 로딩하여 실제 엔티티로 변환하는 방법
// Proxy 엔티티의 Getter 메서드 호출을 통해 실제 엔티티로 변환
EntityA proxyEntity = em.find(EntityA.class, id);
// Getter 호출 시점에서 EntityB가 로딩되고 Proxy가 실제 엔티티로 변환됨
EntityB realEntityB = proxyEntity.getEntityB();
반응형