본문 바로가기
Spring Study

"Eager"(즉시 모드)와 "Lazy"(지연 모드)

by xogns93 2024. 8. 11.

"Eager"(즉시 모드)와 "Lazy"(지연 모드)는 객체의 초기화 시점을 제어하는 개념입니다. 이 개념들은 주로 객체가 생성되거나 초기화되는 시점을 조절하는 데 사용됩니다. 특히 스프링 프레임워크나 JPA 같은 기술들에서 자주 사용되며, 애플리케이션 성능 최적화나 메모리 사용 효율성을 높이는 데 중요한 역할을 합니다.

1. Eager (즉시 모드)

  • 정의: 즉시 모드는 객체가 즉시 초기화되거나 로드됨을 의미합니다. 스프링에서 빈을 즉시 모드로 설정하면, 애플리케이션 컨텍스트가 로드될 때 모든 빈이 즉시 생성되고 초기화됩니다.
  • 특징:
    • 초기화 시점: 객체나 빈이 애플리케이션 시작 시점에 즉시 생성 및 초기화됩니다.
    • 메모리 사용: 모든 객체가 즉시 생성되기 때문에 초기 메모리 사용량이 증가할 수 있습니다.
    • 성능: 초기 로딩 시 시간이 더 오래 걸릴 수 있지만, 필요한 객체가 이미 생성되어 있기 때문에 접근 시점에는 더 빠르게 사용이 가능합니다.
  • 스프링에서의 사용:
    • 기본적으로 스프링 빈은 Eager 모드로 설정되어 있습니다. 이는 애플리케이션 컨텍스트가 로드될 때 모든 빈이 즉시 생성된다는 의미입니다.
  • 예시:
@Component
public class MyEagerBean {
    public MyEagerBean() {
        System.out.println("MyEagerBean created");
    }
}

위 예시에서 MyEagerBean은 스프링 컨텍스트가 시작될 때 즉시 생성됩니다.

2. Lazy (지연 모드)

  • 정의: 지연 모드는 객체나 빈의 초기화를 지연시키는 것을 의미합니다. 즉, 해당 객체가 실제로 필요할 때까지 초기화를 미루는 방식입니다.
  • 특징:
    • 초기화 시점: 객체나 빈이 처음으로 필요할 때(예: 처음으로 호출되거나 주입될 때) 생성 및 초기화됩니다.
    • 메모리 사용: 초기 메모리 사용량이 줄어듭니다, 왜냐하면 필요하지 않은 객체는 초기화되지 않기 때문입니다.
    • 성능: 초기 로딩 시 시간이 단축될 수 있지만, 객체가 처음 필요할 때 생성되므로 그 시점에서 성능 오버헤드가 발생할 수 있습니다.
  • 스프링에서의 사용:
    • 스프링에서 특정 빈을 지연 초기화하려면 @Lazy 애노테이션을 사용합니다. 이를 통해 해당 빈은 실제로 필요할 때까지 생성되지 않습니다.
  • 예시:
@Component
@Lazy
public class MyLazyBean {
    public MyLazyBean() {
        System.out.println("MyLazyBean created");
    }
}

위 예시에서 MyLazyBean은 실제로 해당 빈이 필요할 때까지 생성되지 않습니다.

사용 시 고려사항

  • Eager 로딩:
    • 모든 의존성이 초기화 시점에 필요할 때 사용합니다.
    • 애플리케이션 컨텍스트 초기화 시점에서 발생할 수 있는 모든 오류를 미리 확인할 수 있습니다.
    • 초기화가 복잡하고 시간이 오래 걸릴 경우, 애플리케이션 시작 시간이 길어질 수 있습니다.
  • Lazy 로딩:
    • 대규모 애플리케이션에서 모든 빈을 즉시 로드하면 메모리 낭비가 될 수 있는 경우 사용합니다.
    • 특정 빈이 자주 사용되지 않는 경우, 지연 로딩을 통해 불필요한 리소스 사용을 줄일 수 있습니다.
    • 빈의 초기화가 처음 요청될 때 이루어지므로, 해당 시점에서 지연이 발생할 수 있습니다.

스프링에서의 사용 예시

  • 스프링 컨텍스트에서 Lazy 설정:
@Configuration
public class AppConfig {

    @Bean
    @Lazy
    public MyService myService() {
        return new MyService();
    }
}

 

  • JPA에서의 사용:
    @Entity
    public class User {
    
        @OneToMany(fetch = FetchType.LAZY)
        private Set<Order> orders;
    }
    이 예시에서 orders 컬렉션은 지연 로딩으로 설정되어 있으며, User 엔티티를 조회할 때 orders 컬렉션은 실제로 필요할 때까지 로드되지 않습니다.
  • JPA에서는 EagerLazy를 연관관계(Association)에서 사용합니다. 예를 들어, 엔티티 간의 관계를 설정할 때 관련된 데이터를 즉시 로드할지 지연 로드할지 결정합니다.

요약

  • Eager (즉시 모드): 빈이나 객체가 애플리케이션 시작 시점에서 즉시 초기화됩니다. 초기화 속도가 느릴 수 있지만, 이후의 접근은 빠르게 이루어집니다.
  • Lazy (지연 모드): 빈이나 객체가 실제로 필요할 때까지 초기화를 지연시킵니다. 초기 메모리 사용량을 줄이고, 애플리케이션 시작 시간을 단축할 수 있습니다.

이 두 가지 모드는 각각의 상황에 따라 성능 최적화를 위해 사용되며, 적절한 선택을 통해 애플리케이션의 효율성을 높일 수 있습니다.