반응형

배치 시리즈

https://derveljunit.tistory.com/313

 

스프링 배치 Spring Batch [1] 기본 개념

Spring Batch Batch란? Batch란 영어단어가 일괄 이란 뜻 답게 일괄적으로 처리한다는 뜻입니다. 보통 업계에서는 데이터를 일괄되게 추출(Extract)하거나, 변환(Transformation)하거나, 적재(Load)하는 작업을 앞..

derveljunit.tistory.com

 

Git으로 소스보기

https://github.com/Derveljun/derveljun-batch-examples/tree/master/case1-hellobatch

 

Derveljun/derveljun-batch-examples

Contribute to Derveljun/derveljun-batch-examples development by creating an account on GitHub.

github.com

 

간단한 실행 예제 - Hello Batch Job Step

Dependency Injection

maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
  • spring-boot-starter-data-jpa
  • h2

 

Simple Job Configuration

스프링배치 스키마 설치

만약 JobRepository를 설정하지 않았다면?

배치 실행에 있어 중요한 설정이기 때문에 로컬에 다음과 같은 DB가 설치되어 있다면, 자동으로 스키마 생성을 합니다.

​ batch-derby.properties
​ batch-h2.properties
​ batch-hsql.properties
​ batch-mysql.properties
​ batch-oracle.properties
​ batch-postgresql.properties
​ batch-sqlf.properties
​ batch-sqlserver.properties
​ batch-sybase.properties

JPA를 기본으로 설정해두었다면, JobConfigurer에서 자동으로 스키마를 생성해줍니다.

자동설정이 아닌 직접 DDL을 통해 스키마를 생성하고 싶다면?

  1. spring-batch-core-4.x.x.RELEASE.jar 파일 찾으세요.
    인텔리J라면 External Libraries 안에서 찾으실 수 있습니다.
  2. org/springframework/batch/core 를 찾아가시면, DDL 파일을 찾으실 수 있습니다.

 

Environment Configuration

환경설정

  • 임베디드 H2 사용 설정
spring:
  profiles: local
  datasource:
    hikari:
      jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
      username: sa
      password:
      driver-class-name: org.h2.Driver
  jpa:
    show-sql: true

 

Java Configuration

  • @EnableBatchProcessing 을 설정해야만, 배치 실행이 가능합니다.
@EnableBatchProcessing // Batch 실행 설정
@SpringBootApplication
public class Case1HellobatchApplication {
    public static void main(String[] args) {
        SpringApplication.run(Case1HellobatchApplication.class, args);
    }
}

 

실행계획

  • Job 에서 Step1, Step2 를 차례대로 실행해보겠습니다.
package com.derveljun.batch.case1hellobatch;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Slf4j
@RequiredArgsConstructor // 간편하게 생성자 주입을 위한 Lombok 사용

@Configuration
public class HelloBatchJob {

    private final String BATCH_NAME = "HelloBatchJob_";

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job(){
        return jobBuilderFactory.get(BATCH_NAME)
                .start(step1())
                .next(step2())
                .build();
    }

    @Bean
    public Step step1() {
        return stepBuilderFactory.get(BATCH_NAME + "Step1")
                .tasklet((stepContribution, chunkContext) -> {
                    log.info(BATCH_NAME + "Step1 Started");
                    return RepeatStatus.FINISHED;
                }).build();
    }

    @Bean
    public Step step2() {
        return stepBuilderFactory.get(BATCH_NAME + "Step2")
                .tasklet((stepContribution, chunkContext) -> {
                    log.info((BATCH_NAME + "Step2 Started"));
                    return RepeatStatus.FINISHED;
                }).build();
    }

}

 

실행결과

  • 설정된 데이터베이스와 DDL 이 없으니 자동으로 설정해주는 로그를 확인할 수 있습니다.
2020-01-27 15:54:24.808  INFO 11460 --- [           main] o.s.b.c.r.s.JobRepositoryFactoryBean     : No database type set, using meta data indicating: H2
  • Job 실행에서부터 Step1 , 2가 차례대로 실행한 걸 볼 수 있습니다.
2020-01-27 15:54:24.981  INFO 11460 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=HelloBatchJob_]] launched with the following parameters: [{}]
2020-01-27 15:54:25.004  INFO 11460 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [HelloBatchJob_Step1]
2020-01-27 15:54:25.010  INFO 11460 --- [           main] c.d.batch.case1hellobatch.HelloBatchJob  : HelloBatchJob_Step1 Started
2020-01-27 15:54:25.014  INFO 11460 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [HelloBatchJob_Step1] executed in 10ms
2020-01-27 15:54:25.019  INFO 11460 --- [           main] o.s.batch.core.job.SimpleStepHandler     : Executing step: [HelloBatchJob_Step2]
2020-01-27 15:54:25.021  INFO 11460 --- [           main] c.d.batch.case1hellobatch.HelloBatchJob  : HelloBatchJob_Step2 Started
2020-01-27 15:54:25.022  INFO 11460 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [HelloBatchJob_Step2] executed in 3ms
2020-01-27 15:54:25.024  INFO 11460 --- [           main] o.s.b.c.l.support.SimpleJobLauncher      : Job: [SimpleJob: [name=HelloBatchJob_]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 29ms

 

 

반응형

WRITTEN BY
데르벨준

,