반응형

Job과 Step의 세부적인 내용을 살펴 보기 전에 스프링 배치를 활용하여 Hello, World 부터 출력을 하겠습니다. 개념도 중요하겠지만 스프링 배치는 코드로 먼저 보는 것이 조금 더 직관적이겠습니다.

 

1. 프로젝트 세팅

start.spring.io 사이트트에서 프로젝트 기본 골격을 생성하였습니다.

 

2. 데이터베이스 생성을 위한 docker-compose.yml 파일 생성

version: '3'

services:
  mysql:
    container_name: mysql_batch
    image: mysql/mysql-server:5.7
    environment:
      MYSQL_ROOT_HOST: '%'
      MYSQL_USER: "test"
      MYSQL_PASSWORD: "test"
      MYSQL_DATABASE: "test"
    ports:
      - "3306:3306"
    command:
      - "mysqld"
      - "--character-set-server=utf8mb4"
      - "--collation-server=utf8mb4_unicode_ci"

mysql 구동을 위해서 yml 파일을 만들어주세요.

3. 설정 요소를 위한 application.yml파일 생성 및 작성

spring:
  profiles:
    active: local
  batch:
    job:
      names: ${job.name:NONE}

---
spring:
  config:
    activate:
      on-profile: local
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/test
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: test
    password: test
  jpa:
    show-sql: true
    generate-ddl: false
    hibernate:
      ddl-auto: none
  batch:
    jdbc:
      initialize-schema: ALWAYS

---
spring:
  config:
    activate:
      on-profile: test
  jpa:
    database: h2

데이터베이스 생성 및 배치 구동시 파라미터 전달을 위한 application.yml파일을 작성하였습니다.

4. 도커 명령어를 통해서 데이터베이스 구동

docker-compose up -d

5. main 함수에 배치 수행을 위한 어노테이션 추가

EnableBatchProcessing 어노테이션을 추가해주세요. 이후에 구동을 하고 데이터베이스 테이블을 보게 되면 배치 관련 테이블이 자동으로 생성된 모습을 보실 수 있습니다.

6. job 패키지 생성 및 HelloJobConfig 파일 생성

@Configuration
@RequiredArgsConstructor
public class HelloJobConfig {

    private final JobBuilderFactory jobBuilderFactory;

    private final StepBuilderFactory stepBuilderFactory;

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

    @JobScope
    @Bean
    public Step helloStep(Tasklet tasklet) {
        return stepBuilderFactory.get("helloStep")
                .tasklet(tasklet)
                .build();
    }

    @StepScope
    @Bean
    public Tasklet tasklet() {
        return (contribution, chunkContext) -> {
            System.out.println("Hello Spring batch");
            return RepeatStatus.FINISHED;
        };
    }
}

helloJob이라는 하나의 잡을 생성하고, step을 하나 만들었습니다. step을 구동하기 위해서는 이번 코드에서는 tasklet을 사용하였는데요.

step을 구성하는 방법은 2가지 있습니다. 하나는 tasklet 방식과 다른 방식은 앞전의 설명을 드린 itemReader / itemProcessor / itemWriter 방식으로 처리하는 방식이 있습니다.

간단한 배치 작업은 tasklet 방식을 사용하고 두번째 방법은 차차 살펴 보도록 하겠습니다.

 

7. 수행 시 아래의 파라미터를 넘겨주세요.

--spring.batch.job.names=helloJob

 

반응형

+ Recent posts