본문 바로가기
Spring|Spring-boot/Spring Batch

Batch Hello World

by oncerun 2021. 2. 27.
반응형

스프링 부트를 사용해 실습을 진행할 것이다.

의존성은 다음과 같다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.batch:spring-batch-test'
}

보시면 아시겠지만 Build Tool은 gradle을 사용했다.

 

 

1. 우선 데이터베이스를 이용해서 create database spring_batch; 로 데이터베이스를 만들고 시작했다.

 

그 이후 spring-boot는 main에서 스프링 프로젝트를 실행시켜주므로 Main에서 다음과 같은 어노테이션을 추가했다.

 

//batch 설정
@EnableBatchProcessing
@SpringBootApplication
public class SpringBatchExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBatchExampleApplication.class, args);
    }

}

 

 

이제 Bean등록을 하기위해 configure class를 생성해 Bean으로 Batch에 관련된 job과 step을 정의해 주자.

 

job은 스프링 배치에서 실행 단위라고 생각하시면 됩니다. job을 만들 수 있도록 spring에서는 JobBuilderFactory라는 클래스를 제공합니다. 이 클래스는 배치 설정에 의해 Bean으로 생성되어 있기 때문에 생성자 주입으로 받을 수 있습니다.

 

job은 실행 단위를 구분할 수 있는 incrementer와 job의 이름과 step을 설정했습니다. 

RunIdIncrementer 클래스는 항상 job이 실행 할 때마다 파라미터 id를 자동으로 생성해주는 클래스입니다.

name인 HelloJob은 스프링 배치를 실행할 수 있는 키이기도 합니다.

start()는 job실행 시 최초로 실행될 메서드입니다.

@Configuration
@Slf4j
public class HelloConfiguration {

    private final JobBuilderFactory jobBuilderFactory;


    public HelloConfiguration(JobBuilderFactory jobBuilderFactory){
        this.jobBuilderFactory = jobBuilderFactory;
    }

    @Bean
    public Job helloJob(){
        return jobBuilderFactory.get("HelloJob")  
                .incrementer(new RunIdIncrementer())  
                .start(this.helloStep())
                .build();
   			 }

  }

 

job에 필요한 step 만들기

step은 job에 실행 단위입니다. 하나의 job은 한 개 이상의 step을 가질 수 있습니다.

 

job과 step은 batch의 모든 것이라고 할 수 있기에 좀 더 자세히 공부해야 합니다.

@Configuration
@Slf4j
public class HelloConfiguration {
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;


    public HelloConfiguration(JobBuilderFactory jobBuilderFactory,StepBuilderFactory stepBuilderFactory){
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    @Bean
    public Job helloJob(){
        return jobBuilderFactory.get("HelloJob")
                .incrementer(new RunIdIncrementer())
                .start(this.helloStep())
                .build();
    }

    @Bean
    public Step helloStep(){
        return stepBuilderFactory.get("helloStep")
                .tasklet(
                        (contribution, chunkContext) -> {
                    log.info("hello spring batch");
                    return RepeatStatus.FINISHED;
                }
                ).build();
    }
}

 

tasklet은 step의 실행 단위입니다. chunk기반도 있는데 나중에 사용해 보겠습니다.

실행하게 되면 다음과 나옵니다.

여기까지 하면 spring batch애플리케이션을  만든 것입니다.

 

만약 job이 여러 개라면 어떤 job을 실행시켜야 할지 구분이 필요합니다.

 

이렇게 설정하면 해당 애플리케이션을 실행할 때 helloJob만을 실행하겠다는 설정입니다.

 

스프링 배치에서 기본적으로 job설정값을 제공하는데 이 값이 설정되지 않으면 모든 batch가 실행되기 때문에 하나의 설정을 추가합니다.

 

이렇게 키 설정 값을 커스텀해서 변경을 했습니다.

이 설정은 job.name으로 실행할 수 있습니다.

이렇게 되면 모든 job이 실행되는 것 또한 막을 수 있습니다.

반응형

'Spring|Spring-boot > Spring Batch' 카테고리의 다른 글

Spring Batch Parameter  (0) 2021.02.28
Spring Batch Architecture  (0) 2021.02.27
Spring Batch step 작성해보기  (0) 2021.02.27
Spring Batch Job Repository  (0) 2021.02.27
Spring Batch  (0) 2021.02.27

댓글