[Spring] 지연로딩, 즉시로딩

thingzoo·2023년 7월 4일
0

Spring

목록 보기
45/54
post-thumbnail
post-custom-banner

지연로딩과 즉시로딩

  • JPA는 연관관계가 설정된 Entity의 정보를 바로 가져올지, 필요할 때 가져올지 정할 수 있다.

    • 즉, 가져오는 방법을 정하게되는데 JPA에서는 Fetch Type이라 한다.
    • Fetch Type의 종류에는 LAZY, EAGER 가 있다.
    • LAZY지연 로딩으로 필요한 시점에 정보를 가져온다.
    • EAGER즉시 로딩으로 이름의 뜻처럼 조회할 때 연관된 모든 Entity의 정보를 즉시 가져온다.
  • 연관관계 애너테이션에는 default 값이 있는데 이를 구분하는 방법이 있다.

    • 애너테이션 이름에서 뒤쪽에 Many가 붙어있으면 설정된 해당 필드가 Java 컬렉션 타입일 것이다.
      • 즉, 해당 Entity의 정보가 여러 개 들어있을 수 있다는 것을 의미한다.
      • 따라서 효율적으로 정보를 조회하기 위해 지연 로딩이 default로 설정되어있다.
    • 반대로 이름 뒤쪽이 One일 경우 해당 Entity 정보가 한 개만 들어오기 때문에 즉시 정보를 가져와도 무리가 없어 즉시 로딩이 default로 설정되어있다.

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

  • 지연 로딩은 영속성 컨텍스트의 기능 중 하나
    • 따라서 지연 로딩된 Entity의 정보를 조회하려고 할 때는 반드시 영속성 컨텍스트가 존재해야한다.
    • ‘영속성 컨텍스트가 존재해야한다’라는 의미는 결국 '@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() 즉, 필요한 시점에 조회하려고 하면 오류가 발생할 것이다.
  • 따라서 지연 로딩된 정보를 조회하려고 할 때는 반드시 트랜잭션이 적용되어 영속성 컨텍스트가 존재하는지를 확인해야한다.
profile
공부한 내용은 바로바로 기록하자!
post-custom-banner

0개의 댓글