예제로 배우는 핵심 Spring Batch

Ch02. 일단 실행 - Hello, World (스프링 배치 구조 익히기)

webmaster 2023. 5. 22. 09:13
728x90

SpringInitializer

의존성 추가

  • lombok
  • spring configuration processor
  • jdbc api
  • spring data jpa
  • mysql driver
  • spring batch

docker-compose.yml

version: '3'

services:
mysql:
container_name: spring_batch
image: mysql:5.7
platform: linux/amd64
environment:
MYSQL_DATABASE: "spring_batch"
MYSQL_ROOT_PASSWORD: "password1234"
TZ: "Asia/Seoul"
ports:
- "3307:3307"
command:
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_unicode_ci"
  • docker가 깔려 있다는 전제 하에 진행한다.
  • 해당 프로젝트 하위에 docker-compose.yml 파일 생성 후 위와 같이 작성한다.
    • mac m1칩 같은 경우 platform: linux/amd64를 추가해 주어야 한다.
  • 해당 프로젝트에 터미널을 열어 "docker-compose up" 명령어 실행
    • 만약 잘못 실행이 된다면 "docker ps -a" 명령어를 통해 container 상태 확인 후, "docker rm ["컨테이너 id"]"로 제거 후 실행하여 보자

application.yml

spring:
batch:
job:
name: ${job.name:NONE}
jdbc:
initialize-schema: always # 스키마생성
datasource:
url: jdbc:mysql://127.0.0.1:3307/spring_batch
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: password1234
jpa:
show-sql: true

SpringBatchTutorialApplication

@SpringBootApplication
@EnableBatchProcessing
public class SpringBatchTutorialApplication {

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

}
  • EnableBatchProcessing 추가

HelloWorldJobConfig

@Configuration
@RequiredArgsConstructor
public class HelloWorldJobConfig {
  private final JobBuilderFactory jobBuilderFactory;

  private final StepBuilderFactory stepBuilderFactory;

  @Bean
  public Job helloWorldJob(){
    return jobBuilderFactory.get("helloWorldJob")
        .incrementer(new RunIdIncrementer())
        .start(helloWorldStep())
        .build();
  }

  @Bean
  @JobScope
  public Step helloWorldStep() {
    return stepBuilderFactory.get("helloWorldStep")
        .tasklet(helloWorldTasklet()) //읽고 쓰고 할 데이터가 없을 때 사용
        .build();
  }

  @Bean
  @StepScope
  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;
      }
    };
  }
}

  • --spring.batch.job.name 프로퍼티에 jobName을 전달해 주어야 한다.
    • yml에 참조하도록 되어 있다.
  • JobBuilderFactory, StepBuilderFactory를 주입받는다.
  • helloWorldJob에서는 JobBuilderFactory를 통해 job을 생성하는데, 이때 Step이 필요하다.
  • helloWorldStep에서는 StepBuilderFactory를 통해 step을 생성하는데, 이때는 읽고 쓰고 할 데이터가 없기 때문에 tasklet으로 생성한다.
  • helloWorldTasklet 같은 경우 읽고 쓰는 작업이 따로 필요 없을 때 사용하고, 여기서는 "hello world spring batch"를 콘솔에 출력 후, RepeatStatus의 FINISHED를 반환한다.
    • RepeatStatus의 FINISHED는 정상 수행 완료되었을 때 반환하는 상태코드이다.
728x90