[스프링] fetch 란?

구동현·2024년 1월 29일

스프링

목록 보기
18/21

fetch란

    @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());
    }
  • food는 외래키 userId를 가지고 있다.
  • 마지막 프린트문은 user의 이름을 가지고 오는 메소드
  • 그렇다면 이 테스트메소드는 언제 user이름을 가지고 올 것인가
    1. 한번에 leftjoin으로 가지고 오기
    1. food와 user 따로 가지고 오기

  • 한번에 가지고 오는 것을 관찰할 수 있다.
  • FetchType.EAGER 이기 때문이다.

fetchType = eager

fetchType = lazy

@Entity
@Getter
@Setter
@Table(name = "food")
public class Food {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}

이런 경우에는,


에러가 뜬다.

@Transactional 을 선언하지 않았기 때문

profile
개발합시다

0개의 댓글