"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에서는
Eager
와Lazy
를 연관관계(Association)에서 사용합니다. 예를 들어, 엔티티 간의 관계를 설정할 때 관련된 데이터를 즉시 로드할지 지연 로드할지 결정합니다.
요약
- Eager (즉시 모드): 빈이나 객체가 애플리케이션 시작 시점에서 즉시 초기화됩니다. 초기화 속도가 느릴 수 있지만, 이후의 접근은 빠르게 이루어집니다.
- Lazy (지연 모드): 빈이나 객체가 실제로 필요할 때까지 초기화를 지연시킵니다. 초기 메모리 사용량을 줄이고, 애플리케이션 시작 시간을 단축할 수 있습니다.
이 두 가지 모드는 각각의 상황에 따라 성능 최적화를 위해 사용되며, 적절한 선택을 통해 애플리케이션의 효율성을 높일 수 있습니다.
'Spring Framework' 카테고리의 다른 글
Aspect 와 Aspect J 의 차이 (0) | 2024.08.23 |
---|---|
AOP(Aspect-Oriented Programming)의 중요한 세 가지 기술 (0) | 2024.08.19 |
스프링 프레임워크에서의 메타데이터 (0) | 2024.08.11 |
빈 팩토리(BeanFactory)와 팩토리 빈(FactoryBean) (0) | 2024.08.11 |
스프링 프레임워크의 핵심 3대 요소 (0) | 2024.08.11 |