Lazy Loading은 객체나 데이터를 필요할 때까지 로드하지 않고 지연시키는 전략입니다. 이는 애플리케이션 성능 최적화를 위한 중요한 기법으로, 특히 데이터베이스와의 연관이 깊습니다.
지연된 데이터 로딩
성능 최적화
필요한 데이터만 로드
Lazy Loading은 프록시 객체를 사용하여 동작합니다.
JPA에서는 관계 매핑(OneToMany, ManyToOne 등)에서 @OneToMany, @ManyToOne 어노테이션의 fetch 속성을 통해 Lazy Loading을 설정할 수 있습니다.
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders;
}
@Entity
public class Order {
@Id
@GeneratedValue
private Long id;
private String product;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
FetchType.LAZY: orders 필드는 처음에는 로드되지 않고, 필요할 때 데이터베이스에서 가져옴.FetchType.EAGER: User 엔터티를 로드할 때 orders도 함께 즉시 로드.성능 최적화
유연성 증가
users 리스트를 조회하면서 각각의 orders를 개별적으로 로드하면 성능이 저하될 수 있음.| 특징 | Lazy Loading | Eager Loading |
|---|---|---|
| 데이터 로드 시점 | 필요할 때 로드 | 객체 생성 시점에 즉시 로드 |
| 성능 | 초기 성능 우수, 단점: N+1 문제 | 초기 로딩 느림, 필요한 데이터 모두 로드 |
| 메모리 사용 | 필요 데이터만 로드, 메모리 효율적 | 모든 데이터 로드, 메모리 사용 많음 |
| 구현 복잡도 | 프록시, 초기화 문제로 복잡 | 상대적으로 단순 |
N+1 문제 해결
SELECT u FROM User u JOIN FETCH u.orders;LazyInitializationException 방지
Lazy Loading은 메모리 효율과 성능 최적화를 위해 유용한 기법이지만, 잘못된 사용은 성능 문제를 초래할 수 있습니다. 따라서 설계 시 데이터 사용 패턴을 잘 분석하여 Lazy Loading과 Eager Loading을 적절히 조합하여 사용하는 것이 중요합니다.
추가 학습 자료