본문 바로가기

Spring

Spring Lazy Initialization

>스프링은 애플리케이션이 실행될 때 모든 Bean들을 초기화한다.

  애플리케이션 실행시 bean 초기화에 실패하는 경우는 바로 오류로 나오기에, 장애를 바로 캐치할 수 있다.

 

>이런 장점이 있는 반면,

  의존성이 많은 애플리케이션의 경우에는 ( Bean설정 등 할것이 많은 경우 ) 애플리케이션 실행시간이 늦어지게 될것이다.

 

>이런 상황에, 애플리케이션에 필요한 Bean들을 미리 초기화하는것이 아닌, 필요로 할때  Bean객체를 생성하도록 하는것Lazy 이다.

 

>빈을 만들때 @Bean @Lazy 를 붙여서 만들면 된다.

 

>하지만 ,

  @Lazy가 붙은 빈을 다른클래스에서 주입받는다면 ,

  Lazy하지 않게 된다. 왜냐하면, 주입을 하는 시점에 @Lazy가 붙은 빈이 필요로 하게되고, lazy해야하는것이 이미 생성되어 버린다.

 

>  이럴떄, 즉, DI 할때 Lazy하게 하는 방법은 무엇이 있을까

       --> 바로 생성자 주입시 @Lazy 어노테이션만 붙여주면 된다.

 

==================================================================

한번에 모든 빈들을 Lazy하게 설정해주는 방법은 없을까?

> BeanFactoryPostProcessor Bean을 선언해주는  conifg클래스를 만들어주고 아래처럼 설정하면 된다.

 

  @Configuration

  public class abcConfig{

  @Bean

  public static BeanFactoryPostProcessor beanFactoryPostProcessor(){

      return beanFactory->{

           for(String beanName: beanFactory.getBeanDefinitionNames()) {                    //빈팩토리의 모든 빈들에대해

                 beanFactory.getBeanDefinition(beanName).setLazyInit(true));                  //for문을돌면서 lazy처리해줌

            }

       }

   }