JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있다.
LAZY
, EAGER
가 있다.LAZY
는 지연 로딩
으로 필요한 시점에 정보를 가져온다.EAGER
는 즉시 로딩
으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져온다.연관관계 애너테이션에는 default 값이 있는데 이를 구분하는 방법이 있다.
지연 로딩
이 default로 설정되어있다.즉시 로딩
이 default로 설정되어있다.@Transactional
이 적용되어있어야 한다’라는 의미와 동일하다.@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());
}
}
@Transactional
이 설정되어 있지 않는 경우지연 로딩
된 음식 Entity 정보들을 user.getFoodList()
즉, 필요한 시점에 조회하려고 하면 오류가 발생할 것이다.지연 로딩
된 정보를 조회하려고 할 때는 반드시 트랜잭션이 적용되어 영속성 컨텍스트가 존재하는지를 확인해야한다.