데이터베이스와 상호작용할때 연관된 데이터를 언제 가져올지를 결정하는 방식.
주로 ORM(Object-Relational Mapping) 프레임워크(예: JPA, Hibernate)에서 사용된다.
Eager (즉시 로딩)
- 데이터를 즉시 가져오는 방식
- 연관된 데이터까지 한번에 로드한다
- 필요한 것 뿐만 아니라, 나중에 쓸지도 모르는 것 까지 미리 다 가져온다
특징
1. 즉시 로드
- 객체를 조회할때 연관된 데이터도 함께 조회하여 메모리에 로드
2. SQL 쿼리 증가 가능성
- 연관된 모든 데이터를 가져오기 때문에 SQL 쿼리가 복잡하거나 많아질 수 있음
3. 성능 저하 가능
- 필요하지 않은 데이터를 가져오면 메모리를 낭비하거나 성능에 영향을 줄 수 있음
예시
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(fetch = FetchType.EAGER)
private List<Order> orders; // 연관된 데이터를 즉시 로드
}
- 결과 : User 객체를 조회하면 해당 사용자의 Order리스트도 즉시 가져온다
Lazy(지연 로딩)
- 데이터를 필요한 시점에 가져오는 방식
- 연관된 데이터를 조회할 때만 실제로 가져온다
특징
1. 지연 로드
- 객체를 처음 조회할때는 연관 데이터를 가져오지 않고 실제로 필요할 때 쿼리를 실행해 데이터를 로드
2. SQL 쿼리 최적화
- 필요한 데이터만 가져오기 때문에 처음에는 더 적은 쿼리가 실행됨
3. 추가 쿼리 발생 가능성
- 연관된 데이터를 필요할 때마다 가져오기 때문에 많은 데이터를 한꺼번에 필요로 하면 여러번의 쿼리가 실행될 수 있음
예시
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders; // 연관된 데이터를 필요할 때 로드
}
- 결과 : User 객체를 조회해도 Order 리스트는 가져오지 않음. orders에 접근할 때 추가로 쿼리가 실행됨
언제 사용할까
1. Eager
- 연관 데이터를 항상 사용하는 경우
- 성능이나 메모리 문제가 크게 중요하지 않을때
2. Lazy
- 연관 데이터를 가끔 사용하는 경우
- 초기 로딩 성능이 중요하거나, 메모리를 효율적을 사용해야 할때
특징 | Eager | Lazy |
데이터 로드 시점 | 객체를 조회할때 연관된 데이터도 즉시 로드 | 필요한 시점에 연관 데이터를 로드 |
쿼리 실행 방식 | 한번의 쿼리로 모든 데이터를 가져옴 | 필요한 데이터마다 추가 쿼리 실행 |
성능 | 초기 로드가 느리고 메모리 낭비 가능 | 초기 로드는 빠르지만 추가 쿼리가 발생 |
사용 사례 | 연관 데이터를 항상 사용해야 할때 | 연관 데이터를 가끔만 사용할때 |
주의점
1. Lazy 로딩과 N + 1 문제
- Lazy 로딩은 데이터를 하나씩 가져올 때마다 추가 쿼리를 실행한다
- 예를들어 10명의 사용자를 조회하고, 각 사용자의 주문을 조회하면 1 + 10(N) 개의 쿼리가 실행될 수 있음
- 이를 해결하려면 JOIN FETCH 같은 기술을 활용해야 함
2. Eager 로딩의 과도한 데이터 로드
- 연관 데이터가 너무 많을 경우, 한꺼번에 로드하면 메모리 문제나 성능 저하가 발생할 수 있음
정리
Eager : 데이터를 즉시 한꺼번에 가져옴. 연관 데이터를 항상 사용할때 적합
Lazy : 데이터를 필요한 시점에 가져옴. 연관 데이터를 가끔 사용할때 적합
선택은 성능, 데이터 사용 빈도, 프로젝트 특성에 따라 결정된다
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot, JPA] 영속성 컨텍스트 (0) | 2024.12.24 |
---|---|
[Spring Boot] @ManyToOne, @OneToMany (1) | 2024.12.22 |
[Spring Boot] IoC 컨테이너 (2) | 2024.12.21 |
[Spring Boot] 빈이란 (1) | 2024.12.15 |
[Spring Boot] ApplicationRunner (0) | 2024.12.14 |