@Test
@DisplayName("아보카도 피자 조회")
void test1() {
Food food = foodRepository.findById(2L).orElseThrow(NullPointerException::new);
System.out.println("food.getName() = " + food.getName());
System.out.println("food.getPrice() = " + food.getPrice());
System.out.println("아보카도 피자를 주문한 회원 정보 조회");
System.out.println("food.getUser().getName() = " + food.getUser().getName());
}
LAZY
: 지연 로딩
으로 필요한 시점에 정보를 가져옴EAGER
: 즉시 로딩
으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져옴LAZY
로 지정되어 있고EAGER
로 되어 있음지연 로딩
이 default로 설정되어 있음즉시 로딩
이 default로 설정되어 있음@Test
@Transactional
@DisplayName("Robbie 고객 조회")
void test2() {
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());
}
}
지연 로딩
으로 설정되어있기 때문에 우선 고객을 조회한 후user.getFoodList()
호출 즉, 주문한 음식의 정보가 필요한 시점에 음식 테이블에 해당 고객 Entity의 식별자 값을 사용하여 Select SQL이 수행됨JPA 기초 강의에서 공부 한 영속성 컨텍스트
지연 로딩도 마찬가지로 영속성 컨텍스트의 기능 중 하나
@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());
}
}
지연 로딩
된 음식 Entity 정보들을 user.getFoodList()
즉, 필요한 시점에 조회하려고 하자 오류가 발생함지연 로딩
된 정보를 조회하려고 할 때는 반드시 트랜잭션이 적용되어 영속성 컨텍스트가 존재하는지 확인 해야함