반응형
지연로딩(Lazy Loading)
- 객체가 실제로 사용될 때까지 데이터베이스에서 데이터를 가져오지 않고, 필요한 순간에 데이터를 가져오는 방식
- 객체 그래프를 따라가면서 데이터를 가져올 때 사용
- 객체 그래프가 복잡하고, 많은 데이터를 가져와야 할 때 사용하면 성능을 향상시킬 수 있다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
즉시 로딩(Eager Loading)
- 객체를 가져올 때 관련된 모든 객체들도 함께 가져오는 방식
- 객체 그래프를 한 번에 모두 가져오기 때문에 지연 로딩보다는 빠른 성능을 보여주지만, 객체 그래프가 매우 복잡하거나, 가져와야 할 데이터의 양이 많을 때는 성능 이슈가 발생할 수 있다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;
}
# 프록시와 즉시로딩 주의
- 가급적 지연 로딩만 사용(특히 실무에서)
- 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생
- 즉시 로딩은 JPQL에서 N+1 문제(하나의 쿼리로 다수의 결과가 나오는 문제)를 일으킨다.
- @ManyToOne, @OneToOne은 기본이 즉시 로딩 -> LAZY로 설정
- @OneToMany, @ManyToMany는 기본이 지연 로딩
- 즉시로딩 기능이 필요하면 JPQL fetch 조인이나, 엔티티 그래프 기능을 사용한다.
반응형
'JPA' 카테고리의 다른 글
JPA의 값타입(임베디드 타입) (0) | 2023.06.18 |
---|---|
영속성 전이와 고아객체 (0) | 2023.03.25 |
JPA-프록시(Proxy) (0) | 2023.03.25 |
JPA (0) | 2022.07.14 |