웹 개발

Spring lazy Initialization

노루아부지 2020. 10. 13. 14:48

기본적으로 스프링 IOC는 애플리케이션을 시작할 때 모든 Bean을 초기화합니다. 이 과정에서 Bean 초기화에 실패할 수도 있는데 이로 인해 애플리케이션 실행 시점에 장애를 사전에 발견할 수 있습니다. 반면에, 시작할 때 모든 Bean을 초기화하는 경우, 애플리케이션의 설정이 많고 무겁다면, 애플리케이션을 초기화할 때 많은 시간이 걸립니다.

반면에, Lazy로 설정이 되어있다면 다른 Bean이 참조하거나 BeanFactory에서 명시적으로 검색할 때까지 Bean은 초기화되지 않습니다.

 

 

Lazy Initialization 활성화하는 방법

 

1) Spring Boot

application.properties에 spring.main.lazy-initialization 의 값을 true로 설정하면 모든 Bean이 Lazy Initialization을 사용합니다.

또는 특정 빈에 대해 Lazy Initialization을 사용하고 싶을 경우 @Lazy Annotation을 사용하면 됩니다.

 

 

Lazy Initialization 실행 예제

public class Writer {
    private final String writerId;
 
    public Writer(String writerId) {
        this.writerId = writerId;
        System.out.println(writerId + " initialized!!!");
    }
 
    public void write(String message) {
        System.out.println(writerId + ": " + message);
    }
}
@SpringBootApplication
public class Application {
 
    @Bean("writer1")
    public Writer getWriter1() {
        return new Writer("Writer 1");
    }
 
    @Bean("writer2")
    public Writer getWriter2() {
        return new Writer("Writer 2");
    }
 
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);
        System.out.println("Application context initialized!!!");
 
        Writer writer1 = ctx.getBean("writer1", Writer.class);
        writer1.write("First message");
 
        Writer writer2 = ctx.getBean("writer2", Writer.class);
        writer2.write("Second message");
    }
}

 

위와 같은 코드가 있을 때 spring.main.lazy-initialization 속성 값을 false로 설정하고 실행하면 아래와 같은 결과가 나타납니다.

 

Writer 1 initialized!!!
Writer 2 initialized!!!
Application context initialized!!!
Writer 1: First message
Writer 2: Second message

 

위 결과를 보면 알 수 있듯 Application context가 시작될 때 Bean이 생성되었습니다.

다음으로 spring.main.lazy-initialization 속성 값을 true로 변경하고 실행하면 아래와 같은 결과가 나타납니다. 이 결과를 보면 애플리케이션 시작 시 Bean을 생성하지 않고 필요할 때만 Bean을 생성하는 것을 알 수 있습니다.

 

Application context initialized!!!
Writer 1 initialized!!!
Writer 1: First message
Writer 2 initialized!!!
Writer 2: Second message

 

Lazy Initialization의 장점

Lazy initialization은 Application이 시작될 때 생성되는 Bean 수를 줄일 수 있으므로 Application의 시작 시간을 개선할 수 있습니다.

 

Lazy Initialization의 단점

더 이상 load 되지 않는 class와 bean들이 필요하기 전까지는 생성되지 않으므로 초기에 startup 될 때 식별할 수 있는 문제를 모를 수 있습니다.

이런 문제는 no class def found errors나 잘못된 설정(failures due to misconfiguration) 등의 오류가 포함될 수 있습니다.

 

DevTools 이란?

Spring Boot의 DevTools는 개발자 생산성을 높이기 위해 제공되고 있습니다.

변경이 있을 때마다 JVM과 application을 재시작하지 않고 동일한 JVM에서 application을 다시 시작할 수 있고 몇 번 재시작하면 재시작 시간이 획기적으로 감소합니다.

 

 

[참고]

https://www.baeldung.com/spring-boot-lazy-initialization

https://brunch.co.kr/@springboot/219

728x90
loading