목차
개요
JPA에서 중요한 주제 중 하나인 FetchType에 대해 이야기해보려고 한다. FetchType은 데이터베이스에서 엔티티를 조회할 때 연관된 엔티티를 언제 로드할 것인지 결정하는 로딩 전략으로 EAGER와 LAZY라는 두 가지 전략이 있는데 각 전략에 대해서 예시를 통해 어떤 환경에 쓰여야하는지 확인해보자
FetchType.EAGER
EAGER 로딩 전략은 한 엔티티가 로드될 때 관련된 모든 엔티티를 함께 로드하는 방식
사용자의 역할(User Role)과 같이 사용자 정보를 불러올 때마다 빈번하게 사용하는 정보의 경우 유용하게 사용됩니다.
예를 들어, 대부분의 웹 서비스에서는 일반 사용자와 관리자의 권한 차이로 인해 사용자가 수행할 수 있는 동작이 달라진다.
이런 경우, 사용자가 로그인하거나 다른 사용자에게 요청을 보낼 때마다 사용자의 역할을 확인해야 한다.
이때 EAGER 로딩 전략을 사용하면, 사용자 엔티티를 로드할 때마다 해당 사용자의 역할 정보도 함께 로드되므로, 이후에 역할 정보를 사용할 때 별도의 데이터베이스 접근 없이 해당 정보를 사용할 수 있다.
하지만 EAGER 로딩 전략은 항상 좋은 것만은 아니다. 필요하지 않은 엔티티를 불필요하게 로드하게 될 수 있으며, 이는 성능 저하와 메모리 낭비를 초래할 수 있습니다. 따라서 EAGER 로딩 전략은 신중하게 사용해야 한다.
FetchType.LAZY
LAZY 로딩 전략은 연관된 엔티티를 실제로 사용하는 시점에 로드하는 방식
UserProfile과 같이 사용자의 상세 정보를 보는 경우와 같이 필요할 때만 데이터베이스에서 조회하여 성능을 향상시키는데 도움이 됩니다.
예를 들어, 웹 서비스에서는 사용자 목록을 보여주거나 특정 사용자의 로그인 상태를 확인하는 경우에는 UserProfile 정보가 필요하지 않기에 이때 LAZY 로딩 전략을 사용하면 UserProfile 정보가 실제로 필요한 시점에만 로드되므로, 불필요한 데이터베이스 접근을 최소화할 수 있다.
하지만 LAZY 로딩 전략 또한 문제가 존재하는데 실제로 필요한 시점에 데이터베이스 접근이 발생하므로, 해당 시점에서 지연이 발생할 수 있습니다. 또한, Hibernate 등의 JPA 구현체에서는 트랜잭션이 이미 종료된 상태에서 LAZY 로딩을 호출하면 'LazyInitializationException'이 발생할 수 있다.
마무리
따라서, FetchType.EAGER와 FetchType.LAZY 중 어느 것을 선택할지는 애플리케이션의 요구사항과 데이터 접근 패턴에 따라 결정해야 한다.
EAGER 로딩은 연관된 엔티티를 빈번하게 사용하는 경우 유용하며, LAZY 로딩은 필요한 시점에만 연관된 엔티티를 로드하여 성능을 향상시키는데 도움이 된다.
'Spring' 카테고리의 다른 글
[SecurityContextHolder] Authentication 분석하기, principal 객체로 유저 이름 가져오기 (0) | 2023.06.29 |
---|---|
JPA관계매핑시 @JoinColumn 옵션 그리고 JPA명명전략(naming strategy) (0) | 2023.06.25 |
SpringBoot+MySQL(JPA) 회원가입,JWT 로그 구현하기 - (2) (1) | 2023.06.23 |
스프링 JPA: 엔티티 필드의 기본값에 대한 고찰 (0) | 2023.06.21 |
@Transient 어노테이션과 DTO를 사용한 레이어 분리 (0) | 2023.04.22 |