JPA는 연관 관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있음
가져오는 방법은 Fetch Type
Fetch Type
LAZY
: 지연 로딩으로 필요한 시점에 정보를 가져옴EAGER
: 즉시 로딩으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져옴@OneToMany
Annotation : Fetch Type의 default 값이 LAZY
@ManyToOne
Annotation : Fetch Type의 default 값이 EAGER
연관 관계 Annotation default 값 구분 방법
Annotation 이름에서 뒤쪽에 Many가 붙어있으면 설정된 해당 필드가 Java 컬렉션 타입
이름 뒤쪽이 One일 경우 해당 Entity 정보가 한 개만 들어오기 때문에 즉시 정보를 가져와도 무리가 없어 즉시 로딩이 default로 설정
지연 로딩은 영속성 컨텍스트 기능 중 하나
따라서 지연 로딩된 Entity의 정보를 조회하려고 할 때는 반드시 영속성 컨텍스트가 존재해야함
영속성 컨텍스트가 존재해야한다
라는 의미는 결국 @Transactional이 적용되어 있어야 한다
라는 의미와 동일일
@Test
@DisplayName("Robbie 고객 조회 실패")
void test3() {
User user = userRepository.findByName("Robbie");
System.out.println("user.getName() = " + user.getName());
System.out.println("Robbie가 주문한 음식 이름 조회");
for (Food food : user.getFoodList()) {
System.out.println(food.getName());
}
}
위 코드에서 @Transactional
이 설정되어 있지 않은 경우
user.getFoodList()
즉, 필요한 시점에 조회하려고 하자 오류 발생지연 로딩된 정보를 조회하려고 할 때는 반드시 @Transactional
이 적용되어 영속성 컨텍스트가 존재하는지 확인해야함