Spring Batchλ λλμ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ° μ¬μ©λλ μ€ν μμ€ νλ μμν¬μ λλ€. Spring Batchλ λ§€μ° μ μ°νλ©° μΌκ΄ μ²λ¦¬ (Batch Processing) μμ μ μ²λ¦¬νλ λ° μ¬μ©λ©λλ€. μ΄λ₯Ό μν΄ Spring Batchλ μμ μ λ¨κ³λ³λ‘ λΆν νμ¬ κ° λ¨κ³λ₯Ό μ€ννκ³ νΈλμμ κ΄λ¦¬μ μμΈ μ²λ¦¬λ₯Ό μ 곡ν©λλ€.
μν Spring Batch νλ‘μ νΈλ₯Ό λ§λλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
Spring Boot CLIλ₯Ό μ¬μ©νμ¬ μ Spring Boot νλ‘μ νΈλ₯Ό μμ±ν©λλ€.
$ spring init --dependencies=web,batch my-batch-project
build.gradle νμΌμ Spring Batch λ° κ΄λ ¨ μμ‘΄μ±μ μΆκ°ν©λλ€.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.batch:spring-batch-core'
implementation 'org.springframework.batch:spring-batch-infrastructure'
testImplementation 'org.springframework.batch:spring-batch-test'
}
Spring Batch μμ (Job)μ νλ μ΄μμ λ¨κ³ (Step)λ‘ κ΅¬μ±λ©λλ€. Jobκ³Ό Stepμ λ§λ€κΈ° μν΄ λ€μκ³Ό κ°μ΄ Java ν΄λμ€λ₯Ό λ§λλλ€.
@Configuration
**public** **class** **BatchConfiguration** {
@Autowired**private** JobBuilderFactory jobBuilderFactory;
@Autowired**private** StepBuilderFactory stepBuilderFactory;
@Bean**public** Step **step1**() {
**return** stepBuilderFactory.get("step1")
.tasklet((stepContribution, chunkContext) -> {
System.out.println("Hello, World!");
**return** RepeatStatus.FINISHED;
})
.build();
}
@Bean**public** Job **job**(Step step1) {
**return** jobBuilderFactory.get("job")
.incrementer(**new** **RunIdIncrementer**())
.start(step1)
.build();
}
}
μ΄ μ½λλ μμ (Job)κ³Ό 첫 λ²μ§Έ λ¨κ³ (Step)μ μ μν©λλ€. 첫 λ²μ§Έ λ¨κ³μμλ "Hello, World!" λ©μμ§κ° μΆλ ₯λ©λλ€.
λ°°μΉλ₯Ό μ€ννλ €λ©΄ SpringApplication.run λ©μλλ₯Ό μ¬μ©νμ¬ Spring Boot μ ν리μΌμ΄μ μ μμν©λλ€.
@SpringBootApplication@EnableBatchProcessing**public**
**class** **MyBatchProjectApplication** {
**public** **static** **void** **main**(String[] args) {
SpringApplication.run(MyBatchProjectApplication.class, args);
}
}
μ΄μ νλ‘μ νΈλ₯Ό λΉλνκ³ μ€νν©λλ€.
$ ./gradlew bootRun
μ΄κ²μΌλ‘ κ°λ¨ν Spring Batch μν νλ‘μ νΈλ₯Ό λ§λ€μμ΅λλ€! μ΄μ Jobκ³Ό Stepμ μΆκ°νκ³ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ°©λ²μ λ°°μΈ μ μμ΅λλ€.