프로그래밍 공부
Spring Bean의 즉시(Eager) 초기화와 지연(Lazy) 초기화 본문
스프링 프레임워크에서 빈(Bean)의 초기화 시점은 애플리케이션 성능과 리소스 사용에 영향을 미치는 중요한 요소야. 이를 제어하는 방식으로 즉시 초기화(Eager Initialization)와 지연 초기화(Lazy Initialization)가 있다.
1. 스프링 빈 초기화 개념
스프링 컨테이너가 빈을 생성하고 의존성을 주입하는 시점을 의미한다.
- 즉시 초기화: 스프링 컨테이너가 시작될 때 빈을 생성하는 방식
- 지연 초기화: 빈이 실제로 사용될 때(lazy loading) 생성하는 방식
2. 즉시 초기화(Eager Initialization)
🔹 개념
- 스프링 컨테이너가 로딩될 때(앱 실행 시) 모든 빈을 미리 생성
- @Configuration 클래스에서 등록된 빈들은 기본적으로 즉시 초기화됨
🔹 특징
✔ 애플리케이션이 시작되자마자 모든 빈이 생성되므로 시작 속도가 느릴 수 있음
✔ 미리 생성되기 때문에 빈의 생성 및 의존성 주입 과정에서 오류를 빨리 발견 가능
✔ 자주 사용되는 빈이라면 즉시 초기화하는 것이 유리함
🔹 사용 예시
@Component
public class EagerBean {
public EagerBean() {
System.out.println("EagerBean 생성됨!");
}
}
➡ 애플리케이션이 시작될 때 바로 EagerBean이 생성됨.
3. 지연 초기화(Lazy Initialization)
🔹 개념
- 빈이 실제로 필요할 때까지 생성하지 않음
- @Lazy 어노테이션을 사용하여 설정 가능
🔹 특징
✔ 애플리케이션 시작 속도가 빨라짐
✔ 사용되지 않는 빈은 생성되지 않으므로 메모리 절약 가능
✔ 하지만, 처음 사용할 때 인스턴스를 생성하므로 속도 지연이 발생할 수 있음
🔹 사용 예시
@Component
@Lazy
public class LazyBean {
public LazyBean() {
System.out.println("LazyBean 생성됨!");
}
}
➡ 이 빈은 실제로 호출될 때까지 생성되지 않음.
4. 즉시 초기화 vs 지연 초기화 비교
구분 즉시 초기화 (Eager) 지연 초기화 (Lazy)
빈 생성 시점 | 애플리케이션 시작 시 | 빈이 실제로 사용될 때 |
앱 시작 속도 | 느림 | 빠름 |
메모리 사용 | 많음 | 절약 가능 |
오류 감지 | 초기 단계에서 감지 가능 | 사용 시점에서 감지 가능 |
사용 예 | 자주 사용되는 빈 | 가끔 사용되거나 무거운 빈 |
5. 전체 프로젝트에서의 설정 방법
스프링 부트에서 모든 빈을 기본적으로 지연 초기화하도록 설정할 수도 있다.
✅ 전체 애플리케이션에 적용
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(MyApplication.class);
application.setLazyInitialization(true); // 전체 빈을 지연 초기화
application.run(args);
}
}
➡ 이렇게 하면 모든 빈이 기본적으로 @Lazy가 적용된 것처럼 동작함.
✅ 특정 빈만 지연 초기화
@Bean
@Lazy
public MyService myService() {
return new MyService();
}
➡ @Lazy를 추가한 빈만 지연 초기화됨.
✅ 참고사항
*@Configuration 에 @Lazy 를 추가하면 설정에 있는 빈들이 @Lazy 로 초기화 된다*
6. 언제 사용하면 좋을까?
상황 추천 방식
빈을 자주 사용함 | 즉시 초기화 (기본값) |
빈을 사용할지 확실하지 않음 | 지연 초기화 (@Lazy) |
애플리케이션 시작 속도가 중요함 | 전체적으로 지연 초기화 적용 |
빈 생성 비용이 큼 | 지연 초기화 적용 |
🔥 정리
✅ 즉시 초기화(Eager Initialization): 애플리케이션 시작 시 빈을 미리 생성하여 빠르게 실행되도록 함.
✅ 지연 초기화(Lazy Initialization): 빈을 실제로 사용할 때 생성하여 메모리를 절약하고 애플리케이션 시작 속도를 높임.
✅ @Lazy 어노테이션을 활용하면 특정 빈만 지연 초기화할 수 있음.
✅ 즉시 초기화는 자주 사용하는 빈에, 지연 초기화는 사용 빈도가 낮거나 무거운 빈에 적합.
✅ 권장사항 : 즉시 초기화이다 왜냐하면 문제가 발생 했을 시 바로 확인이 가능하기 때문이다. 애플리케이션이 시작할때 Spring 구성요소의 오류는 발견되지 않고 런타임 에러가 발생하기 떄문.
'Programming > Spring' 카테고리의 다른 글
Java Spring XML 설정 (0) | 2025.02.10 |
---|---|
Spring Bean Scope (0) | 2025.02.10 |
Spring 의존성 주입 (1) | 2025.02.06 |
Java Bean(EJB), POJO, Spring Bean (0) | 2025.02.06 |
Spring Container (0) | 2025.02.06 |