기본적으로 스프링 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을 다시 시작할 수 있고 몇 번 재시작하면 재시작 시간이 획기적으로 감소합니다.
[참고]
'웹 개발' 카테고리의 다른 글
spring boot에서 mybatis ${} 사용시 sql injection 방어하기 (0) | 2020.11.21 |
---|---|
NPE(Null Pointer Exception)으로부터 안전한 프로그래밍 하기 (1) | 2020.11.08 |
javascript ajax 크로스 도메인 요청하기(CORS) (0) | 2020.09.30 |
시간 기반 UUID 생성(Generate time based UUIDs) (0) | 2020.09.29 |
Lombok Annotation (0) | 2020.09.28 |