즉시 로딩과 지연 로딩

즉시 로딩과 지연 로딩

단순히 member 정보만 사용하는 비즈니스 로직

println(member.getName());

지연 로딩 LAZY을 사용해서 프록시로 조회

@Entity
 public class Member {
 @Id
 @GeneratedValue
 private Long id;
 @Column(name = "USERNAME")
 private String name;
 @ManyToOne(fetch = FetchType.LAZY) //**
 @JoinColumn(name = "TEAM_ID")
 private Team team;
 ..
 }

지연 로딩

Member member = em.find(Member.class, 1L);

Team team = member.getTeam();

team.getName(); // 실제 team을 사용하는 시점에 초기화(DB 조회)

즉시 로딩 EAGER를 사용해서 함께 조회

@Entity
 public class Member {
 @Id
 @GeneratedValue
 private Long id;
 @Column(name = "USERNAME")
 private String name;
 @ManyToOne(fetch = FetchType.EAGER) //**
 @JoinColumn(name = "TEAM_ID")
 private Team team;
 ..
 }

즉시 로딩

즉시 로딩(EAGER), Member조회시 항상 Team도 조회

JPA 구현체는 가능하면 조인을 사용해서 SQL 한번에 함께 조회

프록시와 즉시로딩 주의

  • 가급적 지연 로딩만 사용(특히 실무에서)

  • 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생

  • 즉시 로딩은 JPQL에서 N+1 문제를 일으킨다.

  • @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정

  • @OneToMany, @ManyToMany는 기본이 지연 로딩

Last updated