즉시로딩
- 데이터를 조회할 때 연관된 모든 객체의 데이터까지 한번에 불러오는 것
- (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 |