본문 바로가기
dev/spring

[Spring Framework 6.2] Bean Background Initialization

by igooo 2024. 6. 13.
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 실행 시간을 크게 단축할 수 있다. 

 

 

참고