본문 바로가기
Spring/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)
  • 가급적 지연로딩 사용

'Spring > JPA' 카테고리의 다른 글

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