컴포넌트

Job
- 
하나의 배치 작업을 정의하는 개념 
Job Launcher
- 
JobParameters를 이용하여 Job을 실행함 
- 
실행 결과를 JobRepository에, 실행 중인 Job에서 JobExecution에 정보를 제공함 
Job Parameters
- 
Job을 시작하는데 사용되는 파라미터 
Step
- 
Job에 대한 순차적인 처리 단계 
- 
하나의 Job은 여러 Step을 가질 수 있음 
| Note | Chunk-oriented Processing, Chunk 지향 처리 한 번에 하나씩 데이터를 읽어와 Chunk로 만든 뒤 Chunk 단위로 트랜잭션을 다루는 것을 의미한다. (실패할 경우에 Chunk 단뤼로 롤백한다) 즉, Reader와 Processor에서는 1건씩 다뤄지고, Writer에선 Chunk 단위로 처리된다. 
 | 
Item Reader
Item Processor
Item Writer
Tasklet
- 
Step에서 실행되는 작업 
- 
Chunk 지향 처리를 기본으로 제공 
- 
Tasklet을 별도로 구현하여 사용하는 것이 가능 → 개발자가 Step에서 하고 싶은 내용을 자유롭게 작성 가능 
- 
Tasklet구현을 통해 작성 가능public class SimpleTasklet implements Tasklet { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { // todo return RepeatStatus.FINISHED; } }
- 
StepExecutionListener구현을 통해 실행 전/후 작업 가능public class SimpleTasklet implements Tasklet, StepExecutionListener { @Override public void beforeStep(StepExecution stepExecution) { // before } @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) { // todo return RepeatStatus.FINISHED; } @Override public ExitStatus afterStep(StepExecution stepExecution) { // after return ExitStatus.COMPLETED; } }
메타 테이블
BATCH_JOB_INSTANCE
배치가 정상적으로 수행되면 인스턴스 정보를 기록한다.
이 때, jobParameter 에 따라 실행되므로 중복된 jobParameter 를 전달받으면 실행되지 않는다.
jobParameter 는 아래와 같이 전달할 수 있다.
java -jar batch.jar --spring.batch.job.name=simpleJob param1=true param2=123코드내에서 jobParameter 를 아래와 같이 가져올 수 있다.
@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;
    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
            .start(simpleStep1())
            .next(simpleStep2(null)) // (3)
            .build();
    }
    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1")
            .tasklet((contribution, context) -> {
                log.info("{}", context.getStepContext().getJobParameters()); // (1)
            })
            .build();
    }
    @Bean
    @JobScope
    public Step simpleStep2(@Value("#{jobParameters[params1]}") Boolean params1) {
        return stepBuilderFactory.get("simpleStep2")
            .tasklet((contribution, context) -> {
                log.info("{}", params1); // (2)
            })
            .build();
    }
}- 
Context에서 jobParameter가져오기
- 
spring batch scope 선언으로 파라미터를 통해 jobParameter가져오기
- 
어플리케이션 실행시 jobParameter의 할당되는 것이 아니므로,null을 넣어주더라도 job 실행시에 파라미터가 주입된다
String Batch에는 @StepScope 와 @jobScope 가 있다. @StepScope 를 String Batch 컴포넌트(Tasklet, ItemReader, ItemWriter, ItemProcessor)에 사용하면 Step의 실행시점에 해당 컴포넌트를 Spring Bean으로 생성한다. 또한, @JobScope 는 Job 실행시점에 Spring Bean을 생성한다.
즉, 빈을 어플리케이션 생성 시점이 아닌 scope가 실행되는 시점에 생성하도록 해준다.
| Warning | jobParameter중복 이슈를 우회하는 방법job을 실행할 때 동일한  이를 해결하는 방법으로는 매번  
 
 위 이슈는 해결된 것 같다. optional/omitted jobParameters are reloaded from previous jobs ⇒ 값이 변경되는 것은 반영이 되는데, 값을 제거하면 이전 값이 주입된다. | 
JobParameter
- 
JobParameter로 받을 수 있는 타입은 Date,Double,Long,String이다.- 
Date보단String으로 받아서LocalDate로 변경해서 사용하자.
 
- 
BATCH_JOB_EXECUTION
Job이 정상적으로 수행됬는지, 실패됬는지에 대한 정보를 기록한다.
BATCH_JOB_EXECUTION_PARAMS
애플리케이션을 실행시킬 때 전달한 Job Parameter 정보를 기록한다.
필요한 bean만 로드하기
@ConditionalOnProperty 어노테이션을 통해서 필요한 빈만 로드하기
@ConditionalOnProperty(name = "job.name", havingValue = SampleJobConfig.JOB_NAME) // (1)- 
job.name은 실행시킬 job 이름을 저장하는 값이다.spring.batch.job.name을 사용할 수도 있다.
- 
job.name프로퍼티에SampleJobConfig.JOB_NAME이 있을 경우에 해당 컴포넌트를 생성하는 어노테이션이다.
Common Batch Patterns
참고
노트
- 
chunk사이즈: 한번에 처리될 트랜잭션 단위 (spring batch)
- 
fetchSize: JDBC로 DB에서 한번에 가져올 데이터 양
