728x90
오늘은 Lazy Loading과 Eager Loading에 대해서 알아보자.
영어 그대로 지연 로딩과, 즉시 로딩이다.
Lazy Loading(지연 로딩)은 참조 객체들의 데이터들은 무시하고 해당 엔티티의 데이터만 가져오는 방식.
Eager Loading(즉시 로딩)은 데이터를 가져올 때 하나의 객체만 가져오는 것이 아닌 참조 객체 데이터까지
전부 읽어오는 방식
예시를 보자
아래에 User Entity가 있고 orders라는 필드는 지연 로딩 설정이 되어 있다.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 지연 로딩 설정
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<Order> orders;
}
User user = userRepository.findById(1L);
System.out.println(user.getName()); // 여기까지는 orders를 로드하지 않음
List<Order> orders = user.getOrders(); // 이 시점에서 orders를 로드함
위 코드 주석에서 알 수 있듯이 지연 로딩은 본인을 직접 조회하지 않는 이상 로드하지 않는다.
반대로 즉시로딩을 걸어준다면??
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 즉시 로딩 설정
@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
private List<Order> orders;
}
User user = userRepository.findById(1L);
System.out.println(user.getName()); // 여기서 이미 orders가 로드됨
List<Order> orders = user.getOrders(); // 이 시점에서 이미 orders가 로드됨
위 코드 주석처럼 User 객체를 조회할 때 orders 필드도 함께 로드된다.
실무에선 대부분 Lazy Loading을 사용한다고 한다.
왜그럴까?
간단한 프로젝트를 진행할 때는 한 번에 모든 데이터를 다 불러와도 성능에 큰 영향이 없지만
실무 프로젝트는 엄청나게 많은 양의 데이터를 가지고 있다.
그러므로 지연 로딩을 하지 않고 즉시 로딩을 하게 된다면
성능저하, 메모리 사용량 증가, 네트워크 부하 증가, 등 좋지 않은 상황이 일어날 수 있기 때문이다.
무조건 Lazy를 사용하라는 것은 아니다.
상황에 맞게 잘 활용해보자!
연관관계 default 값
OneToMany: Lazy
ManyToMany: Lazy
ManyToOne: Eager
OneToOne: Eager
'Java+Spring 박살내기' 카테고리의 다른 글
통합 테스트와 단위 테스트 (0) | 2024.07.08 |
---|---|
N+1 원인과 해결 방법 (0) | 2024.07.04 |
Swagger, Springdocs (0) | 2024.05.20 |
오버라이딩과 오버로딩 (0) | 2024.05.10 |
컴파일 시점과 런타임 시점 (0) | 2024.05.09 |