[Spring Cloud] SCDF Spring Cloud Task(Spring Batch)

이준영·2024년 12월 30일

Spring MSA 프로젝트

목록 보기
11/15
post-thumbnail

개요

Spring Cloud Data Flow를 통한 Spring Stream 관리에 대해 학습했었다.
이 외에도 SCDF에서는 Batch를 Task로 관리할 수 있어 이를 테스트 해보려고 한다.

https://www.youtube.com/playlist?list=PLJkjrxxiBSFCaxkvfuZaK5FzqQWJwmTfR
Bath 프로젝트 구현에 대한 자세한 내용은 위 강의를 통해 학습하였다.

공식문서: https://dataflow.spring.io/docs/batch-developer-guides/batch/spring-batch/
공식문서의 가이드도 참조하기 좋은 내용인 것 같다.

Spring Batch

강의를 통해 Batch라는 것의 구현 및 동작 방식을 익혔고 SCDF Task에 올릴 샘플 코드를 작성해보았다.

implementation 'org.springframework.cloud:spring-cloud-starter-task'
@EnableTask
@SpringBootApplication
public class UserDeleteBatchApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserDeleteBatchApplication.class, args);
    }
}

사실 이렇게 @EnableTask 어노테이션을 추가해주면 준비가 끝난다.
그리고 샘플 Batch 코드는 다음과 같다.

@Configuration
public class BatchConfig {

    private final JobRepository jobRepository;
    private final PlatformTransactionManager transactionManager;

    public BatchConfig(JobRepository jobRepository,
                       @Qualifier("transactionManager") PlatformTransactionManager transactionManager) {
        this.jobRepository = jobRepository;
        this.transactionManager = transactionManager;
    }

    @Bean
    public Job exampleJob(Step exampleStep) {
        return new JobBuilder("exampleJob", jobRepository)
                .start(exampleStep)
                .build();
    }

    @Bean
    public Step exampleStep(ItemReader<String> reader,
                            ItemProcessor<String, String> processor,
                            ItemWriter<String> writer) {
        return new StepBuilder("exampleStep", jobRepository)
                .<String, String>chunk(2, transactionManager)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }

    @Bean
    public ItemReader<String> reader() {
        return new ItemReader<>() {
            private final List<String> data = List.of("Spring", "Batch", "5.0", "Example");
            private int index = 0;

            @Override
            public String read() {
                return index < data.size() ? data.get(index++) : null;
            }
        };
    }

    @Bean
    public ItemProcessor<String, String> processor() {
        return item -> "Processed: " + item;
    }

    @Bean
    public ItemWriter<String> writer() {
        return items -> items.forEach(System.out::println);
    }

}

여기서 @Qualifier를 설정해주지 않으면 Spring Boot의 HibernateJpaConfiguration에서 정의된 기본 transactionManager와 Spring Cloud Task에서 정의된 transactionManager 중 어떤 빈을 주입해야 할지 결정하지 못해 에러가 뜬다.

그리고 @EnableBatchProcessing은 Spring Batch 5.0 버전 이후부터 명시해주지 않았을 때 자동으로 Batch 관련 설정을 해주고 명시했을 때는 일부 충돌이 생기는 문제가 있어 제거해주었다.

SCDF Task

이제 Batch 모듈을 jar파일로 만들어 준다.

./gradlew bootjar

그리고 SCDF dashboard에서 application등록 해주고 task 등록을 해주면 끝이다.

URI에 jar 파일 경로를 입력해준다.
file 또는 maven 경로를 입력해주면 된다.

Task 등록

이후에는 대쉬보드에서 Batch 실행을 할 수 있게 된다.

마치며

CLI로 Application 등록과 Task 등록 방법, 스케줄링 방법도 찾아서 적용해봐야 한다.
현재로선 SCDF의 기초적인 기능을 학습한 수준이라 이후 샘플 기능이 아닌 실제 서비스를 위한 기능으로 만들어보고 적용해보면 좋을 것 같다.

profile
환영합니다!

0개의 댓글