지연 로딩과 즉시 로딩

@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());
}
- N : 1의 양방향 관계인 음식 테이블과 고객 테이블이 있고 아보카도 피자를 조회해보면.

- "아보카도 피자"의 가격을 조회하려고 했을 뿐인데 자동으로 Join문은 사용하여 연관관계가 설정되어있는 고객 테이블의 정보도 가져오고있다.
- JPA는 연관관계가 서정된 Entity의 정보를 바로 가져올지, 필요할 떄 가져울지 정할 수 있는데
- 이렇게 가져오는 방법을 정하는걸 JPA에서는 Fetch Type이라고 부른다.
- Fetch Type에는 2가지 종류가 있는데 하나는 LAZY, 다른 하나는 EAGER 이다.
- LAZY는 "지연 로딩"으로 필요한 시점에 정보를 가져오고
- EAGER는 "즉시 로딩"으로 조회할 때 연관된 모든 Entity의 정보를 즉시 가져온다.
- 기본적으로 @OneToMany 에너테이션은 LAZY로 default, @ManyToOne은 EAGER로 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());
}
}
- 이번에는 Robbie 고객을 조회한 후 Robbie 고객이 주문한 음식들의 이름을 조회했더니

- @OneToMany 즉, default가 "지연 로딩"으로 설정되어 있기 떄문에 우선 고객을 주문한 후
- user.getFoodList() 호출 즉, 주문한 음식의 정보가 필요한 시점에 음식 테이블에 해당 고객 Entity의 식별자 값을 사용하여 Select SQL이 실행되는 것을 볼 수 있다.
영속성 컨텍스트와 지연 로딩
- 지연 로딩도 영속성 컨텍스트의 기능 중 하나인데
- 따라서 지연 로딩 된 Entity의 정보를 조회하려고 할 때는 반드시 영속성 컨텍스트가 존재해야한다.
- 영속성 컨텍스트가 존재 == 트랜잭션이 적용되어있어야한다.
'SPRING' 카테고리의 다른 글
Spring Data JPA - (spring - 8) (0) | 2023.12.23 |
---|---|
SpringBoot의 JPA - (spring - 7) (0) | 2023.12.23 |
영속성 컨텍스트 - (spring - 6) (0) | 2023.12.23 |
spring의 3가지 핵심 특징(IoC/Di, PSA, AOP)와 3가지 계층구조 - ( spring - 5) (0) | 2023.12.23 |
Spring MVC - (spring - 4) (0) | 2023.12.22 |