본문 바로가기
Java/Spring Data Jpa

즉시로딩, 지연로딩

by o3oppp 2023. 12. 23.
즉시로딩
  • 데이터를 조회할 때 연관된 모든 객체의 데이터까지 한번에 불러오는 것
  • (fetch = FetchType.EAGER)
  • 프록시를 가져오지 않고 실제 엔티티를 가져옴
// Member와 Team이 N:1
public class Member {
...
@ManyToOne(fetch = FetchType.EAGER) // 즉시로딩
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member1 = new Member();
member1.setUserName("member1");
member1.setTeam(team);
em.persist(member1);

em.flush();
em.clear();

Member m = em.find(Member.class, member1.getId()); // 프록시가 아님(DB쿼리가 나감)

System.out.println("member1.getTeam() = " + m.getTeam().getClass());

m.getTeam().getName();


지연로딩
  • 필요한 시점에 연관된 객체의 데이터를 불러오는 것
  • (fetch = FetchType.LAZY)
  • 먼저 프록시를 가져온 후, 실제 사용 시 초기화(DB쿼리가 나감)
// Member와 Team이 N:1
public class Member {
...
@ManyToOne(fetch = FetchType.LAZY) // 지연로딩
@JoinColumn(name = "TEAM_ID")
private Team team;
...
}
Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member1 = new Member();
member1.setUserName("member1");
member1.setTeam(team);
em.persist(member1);

em.flush();
em.clear();

Member m = em.find(Member.class, member1.getId()); // 프록시

System.out.println("member1.getTeam() = " + m.getTeam().getClass());

System.out.println("============");
m.getTeam().getName(); // 실제 team 사용 시 쿼리가 나감

  • 모든 연관관계에 지연 로딩 사용(JPQL에서는 N+1 문제 발생)
  • @ManyToOne, @OneToOne : 기본이 즉시 로딩
  • @OneToOne, @ManyToMany : 기본이 지연 로딩

N+1문제
  • 즉시로딩 + JPQL에서 발행
Team team = new Team();
team.setName("teamA");
em.persist(team);

Member member1 = new Member();
member1.setUserName("member1");
member1.setTeam(team);
em.persist(member1);

em.flush();
em.clear();

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

tx.commit();

  • Member 조회 시 Team까지 조회(조회 횟수 +1)
  • 가급적 지연로딩 사용

'Java > Spring Data Jpa' 카테고리의 다른 글

임베디드 타입  (0) 2023.12.30
영속성 전이  (0) 2023.12.29
프록시(Proxy)  (0) 2023.12.20
MappedSuperclass  (0) 2023.12.20
상속관계 매핑  (0) 2023.12.20