본문 바로가기

나만의 작업/Spring

[Spring] Lazy Initialization in Spring Boot 2.2 - 번역

Lazy Initialization in Spring Boot 2.2
https://spring.io/blog/2019/03/14/lazy-initialization-in-spring-boot-2-2

위의 글을 읽다가 조금만 번역해 보았습니다. 잘못된 부분이 있을 수 있으니 있다면 제보해주세요~

 


 

What Does it Mean to be Lazy?
Spring Framework는 기본적으로 application context가 refresh될때 context의 모든 bean을 생성하고 dependency들을 inject(주입)된다.
대조적으로 bean definition이 느리게 초기화되도록 설정되면, 필요할 때까지는 dependency가 inject되지 않는다. 

Lazy Initialization 활성화 시키기
Spring Boot 2.2 에서는 간단하게 새로운 property를 추가할 수 있는데 spring.main.lazy-initialization 값을 true로 설정해서 쉽게 lazy Initialization되게 할 수 있다.

Lazy Initialization의 장점
Lazy initialization은 application이 startup 될때 필요한 class들을 load하고 bean들을 생성해서 startup 시간을 줄이는 효과가 있다.

DevTools이란?
Spring Boot의 DevTools은 개발자 생산성을 높이기 위해 제공되고 있다.
변경이 있을때마다 JVM과 application을 다시 시작하지 않고 DevTools를 사용하면 동일한 JVM에서 application을 다시 시작할 수 있고 몇번 재시작하면 원래 2500m가 걸리던 시간이 거의 80%가 줄어서 500ms가 된다. 

Lazy Initialization의 단점
lazy initialization을 설정하면 startup 시간이 꽤 많이 줄어들 수 있다.
항상 사용하도록 설정하거나 기본적으로 사용하도록 설정되어 있지 않은지 궁금할 수 있는데, lazy initialization에는 몇가지 단점이 있다.
더 이상 로드되지 않는 class와 bean들이 필요하기 전까지는 생성되지 않으므로 초기에 startup(시작)될때 식별할 수 있는 문제를 모를 수가 있다.  
이런 문제는 no class def found errors나 out of memory error, 잘못된 설정으로 실패하는 경우(failures due to misconfiguration)들의 오류가 포함될 수 있다.

web application에서 lazy initialization는 bean initialization를 trigger하는 HTTP 요청의 대기 시간을 증가시킬 수 있다. 
일반적으로 첫 번째 요청이지만 load-balancing와 auto-scaling에 악영향을 미칠 수 있다.

Is This Thing Switched On?
lazy initialization가 appllication에서 어떤 영향을 미치는지 확실하지 않을때 debugger를 사용하는 것이 도움이 될 수 있다.
bean 중 하나의 생성자에 breakpoint를 걸어놓으면 초기화 시점을 알 수 있다.
예를 들어 lazy initialization가 활성화된 Spring Boot Web Application에서 @Controller bean은 Spring MVC DispatcherServlet이나 Spring WebFlux의 DispatcherHandler에 대한 첫번째 요청이 생성될 때까지 생성되지 않는다는 것을 알 수 있다.

Lazy Initialization 설정을 해야할 때
lazy initialization이 지연 될 수 있으므로 지연 시간이 크게 단축 될 수 있지만 몇 가지 단점이 있다.

개발중이라면 lazy initialization과 DevTools의 hot restarts로 생산성을 획기적으로 향상시킬 수 있다.
application integration tests할 때도 test의 특정 type의 테스트에서 초기화되는 bean의 수를 제한함으로써 테스트 실행 시간을 줄이기 위해 이미 Spring Boot의 Test slice를 사용하고 있을텐데 lazy initialization는 비슷한 최종 결과를 얻기 위한 대체 매커니즘을 제공한다.
slicing을 테스트할 수 있도록 application을 구성할 수 있는 position에 있지 않거나 특정 type의 테스트에 사용할 수 있는 slice가 없는 경우 lazy initialization을 활성화하면 초기화 된 bean이 테스트에 필요하다. 이렇게 하면 test 실행 시간이 단축된다. 특히 개발중에 테스트를 단독으로 실행하는 경우 더욱 단축된다.

마지막으로 production에서 lazy initialization을 사용하는 것이 좋지만 이럴 경우에는 조심스럽게 해야 한다.
web applications의 경우 container orchestration은 응답 속도가 더 빨라지는 /health endpoint의 이점을 얻을 수 있지만 application 자체의 endpoint 중 하나에 대한 최초 요청일때 지연 시간이 증가 할 수 있다. 
또 모든 component가 사용되면 원하지 않는 메모리 에러를 피하기 위해 lazy initialization을 비활성화해서 application의 JVM 의 사이즈를 조정해야 한다.



참고 Link


Spring Tips: Be Lazy AND Fast with Spring Boot 2.2.M1!
https://spring.io/blog/2019/03/14/spring-tips-be-lazy-and-fast-with-spring-boot-2-2-m1

Spring Boot Lazy Loading Beans Example
https://www.onlinetutorialspoint.com/spring-boot/spring-boot-lazy-loading-beans-example.html