카테고리 없음

3. 일단 실행하기 - Hello, World

백엔드 개발자 2022. 12. 11. 12:32

3.0.0 부터는 java 11을 사용하지 않으면  build시 에러가 나서

2.7.6 버전으로 했

Dependencies로

 

  • Spring Batch
  • JDBC API
  • MySQL Driver
  • JPA
  • Spring Configuration Processor
  • Lombok
  • 를 사용한다.

 

 

resourse 파일 yaml로 확장자 변경

 

 

spring:
  batch:
    job:
      names: ${job.name:NONE}
    jdbc:
      initialize-schema: ALWAYS
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_batch
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: password1234

  jpa:
    show-sql: true

names를 저렇게 설정한 이유는 job실행시 job이름을 파라미터로 넘기기 위해서.

 

 

 

Batch를 사용하기 위해 main에 EnableBatchProcessing 어노테이션을 추가해준다.

EnableBatchProcessing은 배치 인프라스트럭처를 사용할 수 있게 해준다.

 

아래의 컴포넌트를 직접 포함시키지 않아도 된다.

 

- JobRepository : 실행중인 잡의 상태를 기록하는데 사용
- JobLauncher : 잡을 구동하는데 사용
- JobExplorer : JobRepository를 사용해 읽기 전용 작업을 수행하는데 사용
- JobRegistry : 특정한 런처 구현체를 사용할때 잡을 찾는 용도로 사용
- PlaformTransactionManager : 잡 진행 과정에서 트랜잭션을 다루는데 사용
- JobBuilderFactory : 잡을 생성하는 빌더
- StepBuilderFactory : 스텝을 생성하는 빌더

출차 : https://devfunny.tistory.com/470

 

 

package com.example.SpringBatchTutorial.job;

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.JobScope;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class HelloWorldJobConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job helloWorldJob() { //job 생성
        return jobBuilderFactory.get("helloWorldJob")//이름을 정해주는 코드
                .incrementer(new RunIdIncrementer())//아이디 부여시 시퀀스를 순차적으로 부여할 수 있도록 명시
                .start(helloWorldStep())
                .build();
    }

    @JobScope
    @Bean
    public Step helloWorldStep() {
        return stepBuilderFactory.get("helloWorldStep")
                .tasklet(helloWorldTasklet()) // step안에는 itemreader, processer, writer가 있는데, 읽고 쓰기를 하지 않는 단순한 배치를 만들 때 사용
                .build();

    }
    
    @StepScope
    @Bean
    public Tasklet helloWorldTasklet() {
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello World Spring Batch");
                return RepeatStatus.FINISHED;// 끝났음을 명시하는 status
            }
        };
    }

}

순차적으로 Job, step,  step내부를 구현했다.

@Configuration은 스프링 설정 클래스를 명시하는데 사용하는 어노테이션.

@RequiredArgsConstructor는 생성자 주입을 자동으로 설정해주는 어노테이션.

 

Job과 step을 사용하기 위해서 BuilderFactory를 주입을 받았다.

그 후 Job과 Step 생성.

 

Tasklet 사용으로 읽고 쓰기 없는 단순한 배치 프로그램을 만들었다.

 

발생했던 오류 

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

 

-> mysql 미설치로 발생했어서 설치진행.

+ workbench에서 spring_batch  이름으로 스키마를 생성했다.

 

 

현재 application.yml에서

spring:
  batch:
    job:
      names: ${job.name:NONE}
    jdbc:
      initialize-schema: ALWAYS
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_batch
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: password1234

  jpa:
    show-sql: true

names를 넘겨받기로 했기 때문에

이렇게 configuration으로 설정해야

 

아래와 같이 배치가 작동하는 것을 확인할 수 있다.

 

yaml 파일에 그대로 job이름을 사용해도 동일하게 동작한다.