Spring Batch (2) - Hello, Spring Batch✨ (실습)

연기리·2023년 6월 23일
2

Spring-Batch

목록 보기
2/4
post-thumbnail

📝 개발 환경

  • Java 11
  • Spring 2.7.9, Gradle
  • Mac OS (M1)
  • Intelli J

DI

  • Spring Batch
  • Lombok
  • H2
  • JPA
  • JDBC
  • MySQL

build.gradle 확인

"spring_batch" table 생성


1️⃣ Job 설정

	/*
        Job 은 배치 처리의 최소 실행 단위
        Job 을 만들기 위해 Spring 은 JobBuilderFactory 제공
        이 클래스는 Spring Batch 설정에 의해서, 이미 Bean 으로 설정되어 있기때문에 생성자 주입으로 받을 수 있음
     */
    private final JobBuilderFactory jobBuilderFactory;
    
    public HelloConfiguration(JobBuilderFactory jobBuilderFactory){
        this.jobBuilderFactory = jobBuilderFactory;
    }
    
    
    /*
        job 이름 : helloJob (<- spring batch 를 실행하게 하는 key)
        RunIdIncrementer : 항상 job 이 실행할 때마다 파라미터 id를 자동으로 생성주는 클래스
        start() : job 실행 시, 최초로 실행할 step 설정할 메서드
     */
    @Bean
    public Job helloJob() {
        return jobBuilderFactory.get("helloJob")
                .incrementer(new RunIdIncrementer())
                .start(this.helloStep())
                .build();
    }

2️⃣ Step 설정

	 private final StepBuilderFactory stepBuilderFactory;
     
     public HelloConfiguration(JobBuilderFactory jobBuilderFactory,
                              StepBuilderFactory stepBuilderFactory){
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;	// 추가
    }
    
    /*
        step : job 의 실행 단위 (step 도 job 처럼 Bean 으로 만들어야한다)
        하나의 job 은 하나 이상의 step 을 가진다
        tasklet : step 의 실행 단위 (또 다른 단위로는 chunk 가 있음)
     */
    @Bean
    public Step helloStep() {
        return stepBuilderFactory.get("helloStep")
                .tasklet((contribution, chunkContext) -> {
                    log.info("hello spring batch");
                    return RepeatStatus.FINISHED;
                }).build();
    }

🤔 만약 job이 여러개 있는데, 나는 특정한 것만 실행하고 싶다면?

➡️ IntelliJ - Run/Debug Configuration - Program argument - 실행하고 싶은 job 이름 작성
➡️ helloJob이라는 Job만 애플리케이션 실행할 때 실행하겠다는 설정

  • Modify Options 들어가면 선택 가능

결과 : "hello spring batch" log 확인

✨ 더 좋은 방법

  • application.properties ➡️ application.yml 변경

  • names key 설정을 job.name 파라미터로 설정
    - 이렇게 하면 설정값이 없어도 아무런 배치가 실행되지않아서, 모든 배치가 실행되는 것을 막을 수 있음

  • IntellJ Configuration도 이에 맞게 변경

결과 : "hello spring batch" log 확인


🙌🏻 전체 코드

package gilyeon.spring.batch.part1;

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.core.launch.support.RunIdIncrementer;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration      // Spring 이 이 파일이 설정파일임을 인지할 수 있도록
@Slf4j             // log 찍기 위해
public class HelloConfiguration {

    /*
        Job 은 배치 처리의 최소 실행 단위
        Job 을 만들기 위해 Spring 은 JobBuilderFactory 제공
        이 클래스는 Spring Batch 설정에 의해서, 이미 Bean 으로 설정되어 있기때문에 생성자 주입으로 받을 수 있음
     */
    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;


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

    /*
        job 이름 : helloJob (<- spring batch 를 실행하게 하는 key)
        RunIdIncrementer : 항상 job 이 실행할 때마다 파라미터 id를 자동으로 생성주는 클래스
        start() : job 실행 시, 최초로 실행할 step 설정할 메서드
     */
    @Bean
    public Job helloJob() {
        return jobBuilderFactory.get("helloJob")
                .incrementer(new RunIdIncrementer())
                .start(this.helloStep())
                .build();
    }

    /*
        step : job 의 실행 단위 (step 도 job 처럼 Bean 으로 만들어야한다)
        하나의 job 은 하나 이상의 step 을 가진다
        tasklet : step 의 실행 단위 (또 다른 단위로는 chunk 가 있음)
     */
    @Bean
    public Step helloStep() {
        return stepBuilderFactory.get("helloStep")
                .tasklet((contribution, chunkContext) -> {
                    log.info("hello spring batch");
                    return RepeatStatus.FINISHED;
                }).build();
    }


}
profile
저에게 말을 걸어주세요

1개의 댓글

comment-user-thumbnail
2023년 7월 2일

https://melonplaymods.com/2023/06/11/crocodile-gena-and-cheburashka-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/minecraft-item-pack-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/fbi-unusual-lncidents-unit-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/parachute-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/scp-rrt-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/tarrant-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/boat-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/electro-from-the-movie-spider-man-high-voltage-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/rotten-melon-2-0-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/pirate-ship-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/mecha-godzilla-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/demon-slayer-mod-for-melon-playground-2/
https://melonplaymods.com/2023/06/11/pack-of-reelsnpc-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/animal-human-military-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/subway-surfers-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/hyundai-solaris-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/decorative-pipe-2-version-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/mutant-green-mod-for-melon-playground/
https://melonplaymods.com/2023/06/11/fnaf9-security-brichandreymaisak-mod-for-melon-playground/
https://melonplaymods.com/2023/06/10/big-house-mod-for-melon-playground/

답글 달기