Lazy Loading 지연로딩
지연로딩이란 연관된 엔티티를 즉시 로드하지 않고, 실제로 사용될 때 로드하는 것을 말한다.
Lazy Loading을 쓰는 이유
관계를 맺는 엔티티에서 연관되지 않은 필드만 조회하는 경우 연관된 필드를 호출할 필요가 없으므로 이러한 불필요한 호출을 없애는 것이 지연로딩이다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderDetails;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
Lazy Loading 장점
1. 성능 최적화
필요한 시점에만 데이터를 로드하므로, 모든 연관된 엔티티를 한 번에 로드하는 것보다 쿼리 횟수를 줄일 수 있다. 특히 연관된 데이터가 많고 복잡한 경우, 즉시 로딩보다 성능 향상을 기대할 수 있다.
2. 메모리 효율성
Lazy Loading을 사용하면 실제로 필요한 데이터만 메모리에 올리게 되므로, 대규모 데이터를 다루는 시스템에서 메모리 효율성이 향상된다.
3. 데이터 양 감소
즉시 로딩은 한 번에 모든 데이터를 가져오므로 불필요한 정보가 로드될 가능성이 있다. 지연로딩은 필요한 데이터만 가져오기 때문에 전체 데이터 양을 감소시킬 수 있다.
4. 변경 감지 향상
지연로딩은 영속성 컨텍스트의 변경 감지를 더 효과적으로 수행할 수 있게 한다. 필요한 경우에만 로드되기 때문에, 불필요한 엔티티의 상태 변경을 최소화할 수 있다.
5. 네트워크 비용 감소
지연로딩은 필요한 데이터만을 요청하므로 네트워크 비용이 감소한다. 특히 원격 데이터베이스에 연결되어 있는 경우, 필요한 데이터만을 전송하여 효율적으로 네트워크 자원을 활용할 수 있다.
7. 선택적 로딩
Lazy Loading은 연관된 엔티티를 필요한 시점에 로드할 수 있게 하므로, 특정 사용 케이스에 따라 데이터를 선택적으로 로드할 수 있다.
Lazy Loding 대신 Eager Loading
1. 관련 데이터가 항상 필요한 경우
만약 특정 엔티티의 연관된 데이터가 항상 필요하다면, 지연로딩보다 즉시로딩을 사용하는 것이 더 효율적일 수 있다.
2. 연관된 데이터가 적고 성능 저하 우려가 없는 경우
만약 연관된 데이터가 적고 성능 저하의 우려가 없는 상황이라면, 즉시로딩을 선택할 수 있다. 이는 쿼리 최적화나 특정 사용 사례에서의 편의성을 고려할 때 적절할 수 있다.
3. 데이터 모델이 작고 간단한 경우
프로젝트가 간단하고 데이터 모델이 작을 때는, 지연로딩의 추가적인 이점을 누리기보다는 즉시로딩을 사용하는 것이 코드를 더 간단하게 유지할 수 있다.
// 즉시로딩
@관계(fetch = FetchType.EAGER)
// 지연로딩
@관계(fetch = FetchType.LAZY)
'JPA' 카테고리의 다른 글
[JPA] Embedded Type 임베디드 타입 (2) | 2024.03.05 |
---|