프로그래밍 공부

Spring Bean의 즉시(Eager) 초기화와 지연(Lazy) 초기화 본문

Programming/Spring

Spring Bean의 즉시(Eager) 초기화와 지연(Lazy) 초기화

khj1999 2025. 2. 10. 21:26

스프링 프레임워크에서 빈(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
Comments