BE/Spring & Spring Boot

[Spring Boot] Eager, Lazy

baek-dev 2024. 12. 21. 15:12

데이터베이스와 상호작용할때 연관된 데이터를 언제 가져올지를 결정하는 방식.
주로 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