Eager 전략, Lazy 전략

김인범's avatar
Jan 18, 2025
Eager 전략, Lazy 전략
Contents
EAGERLAZY

EAGER

ManyToOne 관계의 기본값은 FetchType.EAGER 입니다.
EAGER는 즉시 로딩으로
연관되어 있는 엔티티가 즉시 로드되어 아래의 예시를 보면,
Board 엔티티가 조회 될 때, User 객체도 항상 조회됩니다.
단점으로, 불필요한 데이터도 함께 로드되어 올 수 있습니다.
notion image
left join을 통해 두 테이블의 데이터를 한 번에 가져옵니다.
 
연관 엔티티가 컬렉션인 경우, 여러 쿼리가 실행될 가능성이 있습니다.
 

LAZY

LAZY는 지연 로드 입니다.
필요할 때만 연관된 데이터를 로드하여 서버에 가져옵니다.
연관 엔티티가 가끔 필요하거나 성능이 중요한 경우에 사용됩니다.
notion image
만약 해당 전략을 사용할 때, DB 세션이 닫히는 시점이 빠를 경우,
예외처리가 발생할 가능성이 있습니다.
 
Lazy 로딩을 통해 실제로 필요할 때 DB에서 조회하도록 설정합니다.
엔티티가 처음 로드 될 때, 프록시 객체로 대체되어 실제 데이터는 DB에서 가져오지 않습니다.
 
Lazy 로딩은 P/C가 열려있을 때만 데이터를 가져올 수 있어서,
세션이 닫힌 상태에서 연관 엔티티에 접근을 하게되면, 예외가 발생합니다.
💡
이런 문제는 @Transactional(readOnly = true) 을 사용하여
DB세션을 유지시켜 해결할 수 있습니다.
또는
DTO로 변환하여 반환하는 것으로 해결할 수 있습니다.
 
위의 해결방법을 통해, 알 수 있는 점으로는
DB세션의 생성, 종료 시점을 바꿀 수 있다는 것 입니다.
 
원래 DB세션은 Request가 올 때 생성되고, 응답으로 Request 객체가 사라질 때 같이 사라집니다.
이러한 생성,종료 시점을 바꿀 수 있다는 뜻입니다.
 
Share article

taker