본문 바로가기
개발/JPA

[JPA] 지연 로딩 LAZY , 즉시 로딩 EAGER

by Allonsy 2022. 4. 6.
반응형

# 지연 로딩

가급적 지연 로딩 사용!

연관된 엔티티를 프록시 객체로 가져옴

실제 사용할 때 프록시 초기화(디비에서 조회해서 가져옴)

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "TEAM_ID")
    private Team team;

 

# 즉시 로딩

주로 연관된 엔티티를 함께 조회해서 사용할 때 사용

조인 쿼리로 조회

★@ManyToOne, @OneToOne => 기본이 즉시로딩이므로 Lazy로 설정해줘야함★

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "TEAM_ID")
    private Team team;

★즉시 로딩은 JPQL에서 N+1 문제 일으킴★

JPQL은 SQL로 번역해서 실행함 (최적화X)

-> 우선 member를 조회해온 후에 즉시로딩인 경우 team을 조회하는 쿼리가 또 나감 (em.find()는 최적화해서 조인으로 조회)

총 쿼리 수 = member조회 SQL 1번 + 조회된 member의 수 만큼 team 조회 SQL N번

 

해결 방법

1. fetch 조인 (대부분 이걸로 해결)

List<Member> members = em.createQuery("select m from member m join fetch m.team", Member.class)
			.getResultList();

2. EntityGraph 어노테이션

3. BatchSize

 

반응형

댓글