Entity 가 데이터베이스에서 로드될 때, 연관된 Entity 들도 함께 로드되는 방식이다.
즉, Entity 를 조회할 때 자신과 연관된 Entity 를 조인(Join) 을 통해 함께 조회하는 방식
이 방식을 사용하면 1번의 쿼리로 필요한 모든 데이터를 가져올 수 있다.
하지만, 모든 데이터를 로드하므로 데이터베이스에 부담을 줄 수 있다.
연관관계가 많고 복잡할수록 비용이 기하급수적으로 늘어나기 때문에! 정확하게 이해하고 필요한 상황이 아니라면, 가급적 모두 지연로딩(Lazy Loading) 을 사용하는게 일반적이다.
지연 로딩(Lazy)
연관된 Entity 를 실제로 사용될 때까지 로드하지 않는 방식
이 방식을 사용하면 필요한 데이터만 로드하므로 메모리 사용량을 줄일 수 있지만, 필요한 데이터를 가져오기 위해 여러 번의 쿼리를 실행해야 할 수 있다.
JPA 는 굳이 필요없는 DB 조회를 줄이면서 성능을 최적화한다.
Entity 가 실제 사용될 때까지 DB 조회를 지연하는 방법을 제공한다.
(Lazy Loading 을 사용하려면 실제 엔티티 객체 대상에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이를 Proxy(프록시) 객체라고 한다.
실제 가짜 객체를 이용하면, 그 때 별도의 쿼리가 나간다.
Eager 와 Lazy 의 장단점 분석
Eager
Lazy
장점
연관된 엔티티를 한번에 모두 가져올 수 있다.
다른 접근 방식보다 훨씬 적은 초기의 로딩 시간
다른 접근 방식에 비해 메모리 소비량 감소
-
-
-
단점
Entity 간의 관계가 복잡해질수록 조인으로 인한 성능 저하가 나타날 수 있다.
초기화가 지연되면 원하지 않는 순간에 성능에 영향을 줄 수 있다.
불필요한 조인까지 포함해서 처리하는 경우가 많다.
JPQL에서 N+1 문제를 일으킨다.
Proxy Object - 프록시 객체
Hibernate 나 JPA 에서 많이 사용되는 개념으로, 데이터베이스에서 엔티티를 직접 가져오는 대신에 엔티티 프록시를 생성하고 이 프록시를 통해 엔티티에 접근한다.
이렇게하면 엔티티의 실제 사용 시점에만 DB 에서 데이터를 가져옴으로써, 성능을 향상시킬 수 있다.
프록시 객체는 원래의 엔티티와 같은 인터페이스를 가지므로 사용자 코드는 원래의 엔티티와 프록시를 구분하지 않고 사용할 수 있다.
Fetch Type?
JPA 가 하나의 Entity 를 조회할 때, 연관관계에 있는 객체들을 어떻게 가져올 것인가를 나타내는 설정 값
JPA 는 ORM 기술로 사용자가 직접 쿼리를 생성하지 않고 JPA 에서 JPQL 을 이용하여 쿼리문을 생성하기에 객체와 필드를 보고 쿼리를 생성한다.
다른 객체와 연관관계 매핑이 되어있으면 그 객체들까지 조회하기 되는데, 이 때 이 객체를 어떻게 불러올 것인가를 설정할 수 있는 값이다.