프레임워크(Framework)/Spring

[Spring Batch] 스프링 배치 Tasklet의 여러 가지 구현 방식 - Spring boot 2.x

잇트루 2023. 7. 2. 22:49
반응형

Tasklet

  • Tasklet 인터페이스는 execute 단일 메서드를 제공한다.
  • Step 내에서 구성되고 실행되는 도메인 객체로 단일 task를 수행하기 위해 사용된다.
  • Tasklet은 구현 클래스, 익명 클래스, 사용자 정의 클래스를 통해 실행할 수 있다.

 

 

기본 구현 클래스

스프링 배치에서 기본적으로 제공하는 구현체를 사용하는 방식이다.

@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            .tasklet(new Tasklet() {
                @Override
                public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                    // 비즈니스 로직 작성
                    return RepeatStatus.FINISHED;
                }
            })
            .build();
}
  • StepBuilderFactory로부터 step을 얻고 tasklet 메서드를 통해 Tasklet을 생성한다.
  • 스프링 배치에서 기본 구현체로부터 오버라이딩하여 내부 로직을 구현할 수 있다.
  • 파라미터에는 StepContribution과 ChunkContext 객체가 들어온다.

 

 

익명 클래스

기본적으로 제공하는 구현체의 execute() 메서드를 익명 클래스로도 사용할 수 있다.

@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            .tasklet((contribution, chunkContext) -> {
                // 비즈니스 로직 작성
                return RepeatStatus.FINISHED;
            })
            .build();
}
  • StepBuilderFactory로부터 step을 얻고 tasklet 메서드를 통해 Tasklet을 익명 클래스로 생성한다.
  • 내부 동작 방식은 기본 구현 클래스 사용방식과 일치하며 더욱 간결하게 Tasklet을 구성할 수 있다.

 

 

사용자 정의 클래스

Tasklet 인터페이스를 상속받아 직접 execute() 메서드를 구현하여 사용할 수 있다.

@Bean
public Step step() {
    return stepBuilderFactory.get("step")
            .tasklet(new CustomTasklet())
            .build();

}
  • 사용자 정의 Tasklet은 해당 객체를 생성하는 것만으로 실행할 수 있다.
  • Tasklet 인터페이스의 구현체인 CustomTasklet을 직접 구현해야 한다.

 

CustomTasklet

public class CustomTasklet implements Tasklet {

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        // 비즈니스 로직 작성
        return RepeatStatus.FINISHED;
    }
}
  • Tasklet 인터페이스를 상속받아 Tasklet의 execute() 메서드를 구현하여 사용자 정의 Tasklet을 구성할 수 있다.

 

 

Job 실행 결과

BatchJobConfiguration

@Configuration
@RequiredArgsConstructor
public class BatchJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job() {
        return jobBuilderFactory.get("job")
                .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) throws Exception {
                        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(new CustomTasklet())
                .build();
    }
}

 

CustomTasklet

public class CustomTasklet implements Tasklet {

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        System.out.println("step3 was executed");
        return RepeatStatus.FINISHED;
    }
}

 

실행결과

2023-06-30 00:13:35.343  INFO 24772 --- [           main] c.e.springbatch.SpringBatchApplication   : Started SpringBatchApplication in 2.585 seconds (JVM running for 3.596)
2023-06-30 00:13:35.344  INFO 24772 --- [           main] o.s.b.a.b.JobLauncherApplicationRunner   : Running default command line with: [name=user1]
2023-06-30 00:13:35.503  INFO 24772 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=job]] launched with the following parameters: [{name=user1}]
2023-06-30 00:13:35.576  INFO 24772 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step1]
step1 has executed
2023-06-30 00:13:35.620  INFO 24772 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [step1] executed in 44ms
2023-06-30 00:13:35.667  INFO 24772 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step2]
step2 has executed
2023-06-30 00:13:35.702  INFO 24772 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [step2] executed in 34ms
2023-06-30 00:13:35.744  INFO 24772 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [step3]
step3 was executed
2023-06-30 00:13:35.778  INFO 24772 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [step3] executed in 34ms
2023-06-30 00:13:35.817  INFO 24772 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=job]] completed with the following parameters: [{name=user1}] and the following status: [COMPLETED] in 277ms
반응형