๐ Step, StepExecution
์ง๋ ์๊ฐ์๋ Job, JobInstance, JobParameter, JobExecution์ ๊ฐ๋ ์ ๋ํด ์ดํด๋ณด์์ต๋๋ค.
์ด๋ฒ ์๊ฐ์๋ Job์ ๊ตฌ์ฑํ๋ ์์ ์ ๋จ์์ธ Step, StepExecution ๊ฐ์ฒด์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
(์์ ์ฝ๋๋ GitHub์์ ํ์ธํ ์ ์์ต๋๋ค. ๐)
๐ ํด๋น ํฌ์คํ ์ ๋ชฉํ
- Spring Batch Step
- Spring Batch StepExecution
๐ Step
๊ธฐ๋ณธ ๊ฐ๋
- Step์ ๋ ๋ฆฝ์ ์ด๊ณ ์์ฐจ์ ์ธ Batch Job์ ์บก์ํํ๋ ๋๋ฉ์ธ ๊ฐ์ฒด
- Step์๋ ์ค์ Batch ์ฒ๋ฆฌ๋ฅผ ์งํํ๋๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๋ค์ ํฌํจํ๊ณ ์์
- Step์ ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋งํผ ๊ฐ๋จํ๊ฑฐ๋ ๋ณต์กํ ์ ์์
- ๋ชจ๋ Job์ ํ๋ ์ด์์ Step์ผ๋ก ๊ตฌ์ฑ๋จ
๊ธฐ๋ณธ ๊ตฌํ์ฒด
- TaskletStep : ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํด๋์ค๋ก Tasklet ํ์ ์ ๊ตฌํ์ฒด๋ค์ ์ ์ด
- PartitionStep : ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก Step์ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ๋ฆฌํด์ ์คํ
- JobStep : Step ๋ด์์ Job์ ์คํํ๋๋ก ํจ
- FlowStep : Step ๋ด์์ Flow๋ฅผ ์คํํ๋๋ก ํจ
๊ตฌํ์ฒด์ ๋ฐ๋ฅธ ๊ฐ Step ์์ฑ
// Tasklet - ์ง์ ์์ฑํ Tasklet ์คํ
@Bean
public Step step1() {
return this.stepBuilderFactory.get("step")
.tasklet(myTasklet())
.build();
// Tasklet - ChunkOrientedTasklet ์คํ
@Bean
public Step step1() {
return this.stepBuilderFactory.get("step")
.<Member,Member>chunk(100)
.reader(reader())
.writer(writer())
.build();
// JobStep - Step์์ Job์ ์คํ
@Bean
public Step step1() {
public Step jobStep () {
return this.stepBuilderFactory.get("step")
.job(job())
.launcher(jobLauncher)
.parametersExtractor(jobParametersExtractor())
.build();
// FlowStep - Step์์ Flow๋ฅผ ์คํ
@Bean
public Step step1() {
public Step flowStep () {
return this.stepBuilderFactory.get("step")
.flow(myFlow())
.build();
๊ฐ Step์ ์ ์ฝ๋์ฒ๋ผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑ์ ํ ์ ์์ต๋๋ค.
Spring Batch๋ฅผ ๋ง์ด ์ ํด๋ณด์ง ์์์ง๋ง ๋ณดํต ๊ฐ๋จํ ์์ ์ ์ฒซ ๋ฒ์งธ์ Tasklet์ ์ง์ ์์ฑํ๋ ๋ฐฉ์์, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ Chunk ๊ธฐ๋ฐ์ ๋ ๋ฒ์งธ ๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ธ ๋ฒ์งธ์ ๋ค ๋ฒ์งธ๋ ์ธ์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ฒ ์ข์ ๋ฐฉ๋ฒ์ธ์ง๋ ์ถํ ํ์ต์ ํ๋ฉด์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ^^;
๐ StepExecution
์๋ StepExecution์ ํ๋๋ค์ ๋ํ ์ค๋ช ์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์ :)
๊ธฐ๋ณธ ๊ฐ๋
- StepExecution์ Step์ ๋ํด ํ ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด๋ก Step ์คํ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํจ
- JobExecution์ ์ ์ฌํ๊ฒ Step์ด ์คํ๋ ๋๋ง๋ค ์๋ก์ด StepExecution์ด ์์ฑ๋จ
- ์ด์ ๋จ๊ณ์ Step์ด ์คํจํด ํ์ฌ Step์ ์คํํ์ง ์์๋ค๋ฉด, StepExecution์ ์์ฑํ์ง ์์
- JobExecution์์ ๊ด๊ณ
- Step์ StepExecution์ด ๋ชจ๋ ์ ์์ ์ผ๋ก ์๋ฃ๋์ด์ผ JobExecution์ด ์ ์์ ์ผ๋ก ์๋ฃ๋จ
- ์ฌ๋ฌ Step ์ค ํ๋๋ผ๋ ์คํจํ๋ฉด JobExecution์ ์คํจํจ
- JobExecution์ StepExecution์ 1 : M์ ๊ด๊ณ
- BATCH_STEP_EXECUTION ํ ์ด๋ธ๊ณผ ๋งคํ
์์ ์ฝ๋
@RequiredArgsConstructor
@Configuration
public class StepExecutionConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Primary
@Bean
public Job stepExecutionJob() {
return this.jobBuilderFactory.get("StepExecutionJob")
.start(step1())
.next(step2())
.next(step3())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("step2 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet((contribution, chunkContext) -> {
System.out.println("step3 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
}
์ด์ ์ฝ๋๋ค๊ณผ ๋๋ถ๋ถ ๋น์ทํ ํ์์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๋ํ ์ค๋ช ์ ์๋ตํ๊ฒ ์ต๋๋ค.
์ ์ฝ๋๋ฅผ ์คํํ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ธํด ๋ณด๋ฉด ์๋์ ๊ฐ์ด ๋ชจ๋ Step์ด ์ ์์ ์ผ๋ก ์คํ๋์ด COMPLETED ์ํ๊ฐ ๋์๊ณ , JOB_EXECUTION ๋ํ COMPLETED ์ํ์ธ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ฒ์๋ ์์๋ ๋ค๋ฅด๊ฒ step2์์ ์์ธ๋ฅผ ๋ฐ์์ํจ ํ ํ ์คํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
(๋ฐ์ดํฐ ํ์ธ์ ์ฝ๊ฒ ๊ตฌ๋ถํ๊ธฐ ์ํด ๊ธฐ์กด ํ ์ด๋ธ ๋ฐ ๋ฐ์ดํฐ๋ Drop ํ ํ ์๋ก ์์ฑํ์ต๋๋ค.)
...
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
throw new RuntimeException("step2 Exception"); // ๊ฐ์ ์์ธ ๋ฐ์
})
.build();
}
...
step2๋ ์คํ์ ๋์์ผ๋ ์์ธ๊ฐ ๋ฐ์ํ์ฌ ์คํจํ๊ธฐ ๋๋ฌธ์ StepExecution์ ์์ฑ์ด ๋์ด BATCH_STEP_EXECUTION ํ ์ด๋ธ์ ์ ์ฅ์ ๋์ง๋ง, ์ํ๋ FAILED์ธ ๊ฑธ ํ์ธํ ์ ์๊ณ , ๊ฒฐ๋ก ์ ์ผ๋ก JOB_EXECUTION์ ์ํ ๋ํ FAILED์ธ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
(step2๊ฐ ์คํจํ๊ธฐ ๋๋ฌธ์ step3์ ์คํ์กฐ์ฐจ ๋์ง ์์ต๋๋ค.)
์ด์ step2์์ ๊ฐ์ ๋ก ๋ฐ์์์ผฐ๋ ์์ธ๋ฅผ ์ ๊ฑฐํ ํ ๋ค์ Job์ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("step2 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ธํด ๋ณด๋ฉด ์ด์ ์ ์ ์์ ์ผ๋ก ์ํ๋ step1์ ์ฌ์คํ์ด ์๋๊ณ , ์คํจํ๋ step2์ ์คํ๋์ง ์์ step3๋ง ์ฌ์ฒ๋ฆฌ๊ฐ ๋์ด ์ํ๋๊ณ ์ํ๊ฐ COMPLETED์ธ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
BATCH_JOB_EXECUTION ํ ์ด๋ธ์๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์๊ณ , ์ํ๊ฐ COMPLETED์ธ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๋ง์ฝ ์ ์ํ์์ ์๋ฌ๊ฐ ์๋ Job & Step์ ํ ๋ฒ ๋ ์คํํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
์ ์ฌ์ง์ ๋ฌธ๊ตฌ์ฒ๋ผ ๋ชจ๋ Step์ด ์คํ๋์๊ฑฐ๋, Job์ ์๋ฌด๋ฐ Step์ด ๊ตฌ์ฑ๋์ง ์์๋ค๊ณ ๋์ค๋ฉฐ COMPLETED๋ก ์ ์ฅ์ด ๋ฉ๋๋ค.
(BATCH_STEP_EXECUTION ํ ์ด๋ธ์๋ ์๋ฌด๋ฐ ๋ฐ์ดํฐ๊ฐ ๋จ์์์ง ์์ต๋๋ค.)
JobInstance์ ๊ฒฝ์ฐ ์๋ก ์์ฑ๋์ง ์๊ณ ๋จ ํ๋์ ๋ฐ์ดํฐ๋ง ์กด์ฌํ๋ ๊ฑธ ํ์ธํ ์ ์๋๋ฐ์, JobInstance์ JobExecution, StepExecution์ ๊ด๊ณ๋ฅผ ๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
JobInstance
- Job์ด ์คํ๋๋ ์์ ์ ์์ฑ๋๋ Job์ ๋ ผ๋ฆฌ์ ์์ ์คํ ๊ฐ๋
- Job์ ์คํ ๊ตฌ๋ถ
- JobExecution์์ ๊ด๊ณ๋ 1 : N
JobExecution
- Job์ ๋ํ ํ ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ฉฐ Job ์คํ ์ค ๋ฐ์ํ ์ ๋ณด๋ค์ ์ ์ฅ
- StepExecution์์ ๊ด๊ณ๋ 1 : N
StepExecution
- Step์ ๋ํ ํ ๋ฒ์ ์๋๋ฅผ ์๋ฏธํ๋ฉฐ Step ์คํ ์ค ๋ฐ์ํ ์ ๋ณด๋ค์ ์ ์ฅ
- Step์ด ์คํ๋ ๋๋ง๋ค ์๋ก์ด StepExecution์ด ์์ฑ
์ฐธ๊ณ ๋ฌธ์
- 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 (7) JobRepository (0) | 2022.11.08 |
---|---|
Spring Batch (6) ExecutionContext (0) | 2022.11.05 |
Spring Batch (4) Job, JobInstance, JobParameters, JobExecution (0) | 2022.11.01 |
Spring Batch (3) DB ์คํค๋ง (0) | 2022.10.30 |
Spring Batch (2) ํ๋ก์ ํธ ๊ตฌ์ฑ ๋ฐ ์์กด์ฑ ์ค์ , Hello World (0) | 2022.10.29 |
๋๊ธ