๐ ํด๋น ํฌ์คํ ์ ๋ชฉํ
- Spring Batch ํ๋ก์ ํธ ์ค์
- Spring Batch ์ค์ ๋ด๋ถ
- Spring Batch Hello World
๐ Spring Batch ํ๋ก์ ํธ ๊ตฌ์ฑ
ํ๋ก์ ํธ ๊ตฌ์ฑ์ IntelliJ, Java 11, Gradle, MySQL(Docker), H2, Spring Boot, Batch ๋ฑ์ ์ฌ์ฉํ ์์ ์ ๋๋ค.
(ํ๋ก์ ํธ ์ค์ ๊ด๋ จ ์ค๋ช ์ ์์ผ๋ GitHub๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.)
๐ Spring Batch ์์กด์ฑ ์ค์
์คํ๋ง ๋ฐฐ์น๋ฅผ ์๋์ํค๊ธฐ ์ํด ๋ฉ์ธ ํด๋์ค์ @EnableBatchProcessing ์ด๋ ธํ ์ด์ ์ ์ ์ธํด์ผ ํฉ๋๋ค.
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableBatchProcessing
@SpringBootApplication
public class SpringBatchApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBatchApplication.class, args);
}
}
@EnableBatchProcessing ์ด๋ ธํ ์ด์ ์ 4๊ฐ์ ์ค์ ํด๋์ค๋ฅผ ์คํ์ํค๊ณ , ์คํ๋ง ๋ฐฐ์น์ ์ด๊ธฐํ ๋ฐ ์คํ ๊ตฌ์ฑ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค.
1. @EnableBatchProcessing
์คํ๋ง ๋ฐฐ์น ์๋์ ์ํด ์ ์ธํด์ผ ํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ด๋ถ์๋ BatchConfigurationSelector ํด๋์ค๊ฐ Import ๋์ด ์์ต๋๋ค.
BatchConfigurationSelectors ํด๋์ค
BatchConfigurationSelector ํด๋์ค์๋ modular ์ฌ๋ถ์ ๋ฐ๋ผ ์ค์ ํ ํด๋์ค๋ฅผ ์ ํํ๋๋ฐ, modular๋ ๋ฐ๋ก ์ค์ ํ์ง ์๊ธฐ์ SimpleBatchConfiguration ํด๋์ค๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ค์ ํ๊ฒ ๋ฉ๋๋ค.
2. AbstractBatchConfiguration ์ถ์ ํด๋์ค & SimpleBatchConfiguration ํด๋์ค
SimpleBatchConfiguration ํด๋์ค๋ AbstractBatchConfiguration ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค.
AbstractBatchConfiguration ์ถ์ ํด๋์ค๋ JobRepository, JobBuilderFactory, StepBuilderFactory ๋ฑ์ ๋น์ผ๋ก ๋ฑ๋กํฉ๋๋ค.
JobBuilderFactory, StepBuilderFactory ๊ฐ์ฒด๋ Bean ์ด๊ธฐํ ์ ์ค์ ๋ฉ์๋์ธ afterPropertiesSet() ๋ฉ์๋์์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฃผ์ ํฉ๋๋ค.
...
@Override
public void afterPropertiesSet() throws Exception {
this.jobBuilderFactory = new JobBuilderFactory(jobRepository());
this.stepBuilderFactory = new StepBuilderFactory(jobRepository(), transactionManager());
}
SimpleBatchConfiguration๋ ์คํ๋ง ๋ฐฐ์น์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ฅผ ํ๋ก์ ๊ฐ์ฒด(createLazyProxy() ๋ฉ์๋)๋ก ์์ฑํฉ๋๋ค.
(ํ๋ก์ ํจํด์ ๋ํ ๊ฐ๋ ์ ํด๋น ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.)
- JobRepository
- JobLauncher
- JobRegistry
- ...
3. BatchConfigurerConfiguration ํด๋์ค
์ SimpleBatchConfiguration ๊ณผ์ ์ด ๋๋๋ฉด BatchConfigurerConfiguration ํด๋์ค๊ฐ ์๋ํ๊ฒ ๋ฉ๋๋ค.
BatchConfigurerConfiguration ํด๋์ค์๋ BasicBatchConfigurer, JpaBatchConfigurer ๋ ์ค์ ์ด ์กด์ฌํฉ๋๋ค.
- BasicBatchConfigurer: SipmleBatchConfiguration ํด๋์ค์์ ์์ฑํ ํ๋ก์ ๊ฐ์ฒด์ ์ค์ ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ค์ ํด๋์ค
- JpaBatchConfigurer: JPA ๊ด๋ จ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ค์ ํด๋์ค
JpaBatchConfigurer ํด๋์ค๋ BasicBatchConfigurer ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ์๊ธฐ์ ํ๋๋ ๋ฉ์๋๋ค์ ๊ณต์ ๊ฐ ๋ฉ๋๋ค.
4. BatchAutoConfiguration ํด๋์ค
๋ง์ง๋ง์ผ๋ก ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ Job ์คํ๊ณผ ๊ด๋ จ๋ Launcher๋ฅผ ์์ฑํ๋ ์ค์ ํด๋์ค์ ๋๋ค.
์ ์ฌ์ง์ 76๋ผ์ธ์์ ์์ฑ๋๋ JobLauncherApplicationRunner ํด๋์ค๊ฐ ์ค์ Job์ ์คํํ๋ ํด๋์ค์ ๋๋ค.
JobLauncherApplicationRunner ํด๋์ค๋ ์์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ค์ 195 ๋ผ์ธ์ execute() ๋ฉ์๋๋ฅผ ํตํด ์คํ๋ง ํ๋ ์์ํฌ์ ApplicationEventPublisher ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ด๋ฒคํธ๋ฅผ ๋ฐํํ์ฌ Job์ ์คํํฉ๋๋ค.
๐ Spring Batch Hello World
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:~/test
username: sa
password:
h2:
console:
enabled: true
path: /h2-console
batch:
jdbc:
initialize-schema: always
package io.spring.springbatch;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@RequiredArgsConstructor
@Configuration
public class HelloJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job helloJob() {
return this.jobBuilderFactory.get("helloJob")
.start(helloStep1())
.next(helloStep2())
.build();
}
@Bean
public Step helloStep1() {
return stepBuilderFactory.get("helloStep1")
.tasklet((contribution, chunkContext) -> {
System.out.println(" ============================");
System.out.println(" >> Hello Spring Batch");
System.out.println(" ============================");
return RepeatStatus.FINISHED;
})
.build();
}
public Step helloStep2() {
return stepBuilderFactory.get("helloStep2")
.tasklet((contribution, chunkContext) -> {
System.out.println(" ============================");
System.out.println(" >> Step2 has executed");
System.out.println(" ============================");
return RepeatStatus.FINISHED;
})
.build();
}
}
- @Configuration : Batch Job ์ ์ ๋ฐ ๋น ์ค์
- JobBuilderFactory : Job์ ์์ฑํ๋ ๋น๋ ํฉํ ๋ฆฌ, AbstractBatchConfiguration ์ถ์ ํด๋์ค์์ Bean์ผ๋ก ๋ฑ๋ก
- StepBuilderFactory : Step์ ์์ฑํ๋ ๋น๋ ํฉํ ๋ฆฌ, AbstractBatchConfiguration ์ถ์ ํด๋์ค์์ Bean์ผ๋ก ๋ฑ๋ก
- Job -> Step -> Tasklet(Step ๋ด์์ ๋จ์ผ ํ ์คํฌ๋ก ์ํ๋๋ ๋ก์ง) ์์ผ๋ก ๊ตฌ์ฑ
์ฐธ๊ณ ๋ฌธ์
- https://docs.spring.io/spring-batch/docs/current/reference/html/index-single.html
- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard
'Spring > Spring Batch' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Batch (6) ExecutionContext (0) | 2022.11.05 |
---|---|
Spring Batch (5) Step, StepExecution (0) | 2022.11.03 |
Spring Batch (4) Job, JobInstance, JobParameters, JobExecution (0) | 2022.11.01 |
Spring Batch (3) DB ์คํค๋ง (0) | 2022.10.30 |
Spring Batch (1) ๊ฐ์ (0) | 2022.10.28 |
๋๊ธ