같이 읽기 좋은 글 :
프록시(Proxy)
Fetch Join (패치 조인) 이란? (w/ N+1 문제)
즉시 로딩
- 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다
@ManyToOne(fetch = FetchType.EAGER)
지연 로딩
- 연관된 엔티티를 실제 사용할 때 조회한다
@ManyToOne(fetch = FetchType.LAZY)
연관된 엔티티를 즉시 조회한다. 하이버네이트는 가능하면 SQL 조인을 사용해서 한번에 조회한다
@Entity
public class Member{
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team
}
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
연관된 엔티티를 프록시로 조회한다. 프록시를 실제 사용할 때 초기화하면서 데이터베이스를 조회한다
@Entity
public class Member{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team
}
Member member = em.find(Member.class, "member1");
Team team = member.getTeam(); //객체 그래프 탐색
team.getName(); //팀 객체 실제 사용
em.find(Member.class, “member1”) 호출하면 회원만 조회하고 팀은 조회하지 않는다fetch 속성의 기본 설정값
@ManyToOne, @OneToOne : 즉시 로딩@OneToMany, @ManyToMany : 지연 로딩추천하는 방법 : 모든 연관관계에 지연로딩을 사용하자 ⇒ 개발이 어느정도 완료단계에 왔을 때 실제 사용하는 상황을 보고 꼭 필요한 곳에만 즉시 로딩을 사용하도록 최적화하자
출처: 자바 ORM 표준 JPA 프로그래밍 (김영한)