본문 바로가기
Spring

Spring Day 16 : 지연 로딩과 즉시 로딩

by 우 석 2024. 2. 13.

음식 테이블과 고객 테이블이 N : 1 양방향 관계인 경우

 

N : 1 양방향 관계

 

Test 코드

@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());
}

 

결과

 

“아보카도 피자”의 가격을 조회했지만 자동으로 JOIN 문을 사용하여 연관관계가 설정되어 있는 고객 테이블의 정보도 가져오고 있다.

 

지연 로딩, 즉시 로딩

JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있다.
    - 즉, 가져오는 방법을 정하게되는데 JPA에서는 Fetch Type이라 부른다.

  • Fetch Type 
    • LAZY: 지연 로딩으로 필요한 시점에 정보를 가져옵니다.
    • EAGER: 즉시 로딩으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져옵니다.

기본적으로 @OneToMany 애너테이션은 Fetch Type의 default 값이 `LAZY`로 지정되어 있고 반대로 @ManyToOne 애너테이션은 *`EAGER`로 되어있다.


영속성 컨텍스트와 지연 로딩

지연 로딩도 영속성 컨텍스트의 기능 중 하나입니다.
따라서 지연 로딩된 Entity의 정보를 조회하려고 할 때는 반드시 영속성 컨텍스트가 존재해야 합니다.
‘영속성 컨텍스트가 존재해야 한다’라는 의미는 결국 ‘트랜잭션이 적용되어있어야 한다’라는 의미와 동일합니다.