728x90
개요
Spring Framework 6.2에 추가될 기능 중 Bean Background Initialization에 대해 알아본다.
Quick Start
Spring Framework 6.2 Dependency 설정
아직 Spring Framework 6.2가 정식 릴리즈 되지 않아서 Snapshot 버전으로 설정한다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.1-SNAPSHOT'
id 'io.spring.dependency-management' version '1.1.5'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/snapshot' }
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platfrom:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework:spring-framework-bom:6.2.0-SNAPSHOT"
}
}
Service 클래스 생성
테스트를 위해서 생성자에 3초 대기 시간을 설정한 클래스 2개를 생성한다.
class PaymentService {
private static final Logger logger = LoggerFactory.getLogger(PaymentService.class);
PaymentService() {
try {
TimeUnit.SECONDS.sleep(3L);
logger.info("created PaymentService");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class RefundService {
private static final Logger logger = LoggerFactory.getLogger(RefundService.class);
RefundService() {
try {
TimeUnit.SECONDS.sleep(3L);
logger.info("created RefundService");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Configuration
위에서 정의한 PaymentService, RefundService 클래스를 Bean으로 생성한다.
@Configuration
class BackgroundConfig {
@Bean
PaymentService paymentService() {
return new PaymentService();
}
@Bean
RefundService refundService() {
return new RefundService();
}
}
실행 결과
2024-06-13T22:33:48.755+09:00 INFO 7384 --- [spring-lazy] [ main] : create PaymentService
2024-06-13T22:33:51.762+09:00 INFO 7384 --- [spring-lazy] [ main] : create RefundService
2024-06-13T22:33:51.860+09:00 INFO 7384 --- [spring-lazy] [ main] : Started SpringLazyBeanApplication in 6.803 seconds (process running for 7.406)
Spring 시작까지 7.406초가 걸린다. (Spring 실행 시간 약 1초 + Bean 초기화 시간 (3초 + 3초))
Bean Background Initilization 적용
- @Bean 속성으로 bootstrap 값을 BACKGROUND로 설정한다.
- bootstrapExecutor Bean 이름으로 Executor를 설정해 준다.
- bootstrapExecutor Bean이 없는 경우 일반적인 초기화와 동일하게 동작한다.
- 예제에서는 spring.threads.virtual.enabled=true를 사용하여 VirturalThreadExecutor를 사용한다.
@Configuration
class BackgroundConfig {
@Bean(bootstrap = Bean.Bootstrap.BACKGROUND)
PaymentService paymentService() {
return new PaymentService();
}
@Bean(bootstrap = Bean.Bootstrap.BACKGROUND)
RefundService refundService() {
return new RefundService();
}
@Bean
Executor bootstrapExecutor() {
retrun Executors.newVirtualThreadPerTaskExecutor();
}
}
Bean Background Initilization 적용 후 실행 결과
2024-06-13T22:35:12.055+09:00 INFO 7384 --- [spring-lazy] [ virtual-41] : create PaymentService
2024-06-13T22:35:12.055+09:00 INFO 7384 --- [spring-lazy] [ virtual-39] : create RefundService
2024-06-13T22:35:12.071+09:00 INFO 7384 --- [spring-lazy] [ main] : Started SpringLazyBeanApplication in 3.728 seconds (process running for 4.333)
스프링 시작까지 4.333초가 걸린다. (Spring 실행 시간 약 1초 + Bean 초기화 시간 (3초 + 3초))
Bean Background Initilization을 적용 후에는 BACKGRUOND로 설정된 Bean은 동시에 생성을 시작하여 적용 전에 비하여 3초 정도 시작 시간이 단축된 결과를 볼 수 있다.
Bean 생성 중 외부에서 데이터를 조회가 필요한 클래스들은 Bean Background Initilization을 적용하면 Spring 실행 시간을 크게 단축할 수 있다.
참고
- https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-lazy-init.html
- https://spring.io/blog/2024/04/11/spring-framework-6-2-0-m1-all-the-little-things
'dev > spring' 카테고리의 다른 글
Spring - Modulith - Working with Applicaton Events (0) | 2024.06.21 |
---|---|
[Spring Framework 6.2] Support for fallback beans (0) | 2024.06.15 |
Hello, Java 22! (0) | 2024.06.09 |
[Spring] Spring Framework CDS(Class Data Sharing) (Project Leyden) (0) | 2024.06.06 |
REST Assured로 API 테스트하기 (0) | 2024.06.03 |