Spring Batch-1

송수혁·2023년 1월 21일
0

batch

목록 보기
2/2
post-thumbnail

Spring Batch - 1

  • 간단한 Job 실행
  • @EnableBatchProcessing 의 동작 원리
  • 어떤 설정이 필요한가?
  • 특정 Job 만 수행하는 경우

Version

Spring Batch 4.3.7

main implementation

implementation 'org.springframework.boot:spring-boot-starter:2.7.8'
implementation 'org.springframework.batch:spring-batch-core:4.3.7'
implementation 'org.springframework.batch:spring-batch-infrastructure:4.3.7'

test implementation

testImplementation 'org.springframework.batch:spring-batch-test:4.3.7'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

Project Setting

Gradle Setting & Spring Batch

Spring Batch 를 시작하기 앞서 gradle project 를 세팅한다

build gradle에 위 version 에 명시되어있는 implements 를 진행한다.

기본적인 Spring Framework 와 AutoConfiguration 을 사용하기 위해, Spring boot Starter 를 등록한다.

spring batch 의 사용을 위해 batch 의 core, infrastructure 를 사용한다.
간단하게 눈에 익혀두면 좋다 생각한다

우린 Application 단에 코드를 작성하여, Batch Core 에 있는 Job Launcher 를 통해 우리가 설정한 Job 을 돌리게 된다.

Spring Batch Start

@EnableBatchProcessing 이건 왜 필수?

Spring Batch를 실행하는데는 설정을 해야하는 것이 생각보다 많다.

  • JobLauncher
  • JobRepository
  • TransactionManager
  • JobExplorer

(BatchConfigurer Interface 구현체)

SimpleBatchConfigurer를 통해 동작을 하게 되고, 초기화 진행시에, Bean 중 BatchConfigurer 를 구현한 구현체를 가지고 와서 해당 값을 토대로 SimpleBatchConfigurer 를 설정한다

@EnableBatchProcessing 어노테이션 안의 Import 문을 보게 되면, BatchConfigurationSelector 를 통해 SimpleBatchConfigurer 를 Import 하는 것으로 변경된다

SimpleBatchConfigurer 에 있는 값을 통해 설정 된 내역을 Bean 으로 만들어 두기 때문에 JobBuilderFactory, StepBuilderFactory, JobRepository, JobLauncher 와 같은 설정을 기본으로 잡아준다.

Job 설정하기

Job 은 여러개의 Step, Flow 로 이루어 진다.

job -> Step -> Step -> ... -> end


@Configuration
pubilc class JobConfiguration{
	private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;
   
   	public JobConfiguration(
    	JobBuilderFactory jobBuilderFactory,
	    StepBuilderFactory stepBuilderFactory
    ){
    	this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }
    
	@Bean
    public Job testJobDefine(){
    	return this.jobBuilderFactory.get("testJob")
        				.start(testStepDefine())
                        .build();
    }
    
    @Bean
   	public Step testStepDefine(){
   		return this.stepBuilderFactory.get("testStep")
       			.tasklet((contribution, chunkContext) -> {
                    System.out.println("Start Batch");
                   	System.out.println("End Batch");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

간단하다.
그냥 JobBuilderFactory 를 통해서 Job 을 정의하고, 해당 Job 을 반환하여 사용한다.
세부적인 내용은 다음 포스트에서 다루겠지만, 위 2가지가 핵심적인 내용이라고 봐도 무방하다.

chunk 기반으로 배치를 짜는게 중요하다 라고 얘기했는데,
해당 부분에 대해 다음 포스트에 tasklet 을 chunk 로 수행하는 방법, item reader 등에 대해서 작성한다.

특정 Job 만 수행하게 처리

우린 Spring Batch 에서 Job 을 한꺼번에 수행하는 것이 아닌, 한개의 프로젝트에서 여러 Job 을 설정하고, 특정 Job 을 수행하기를 기대한다.

Spring Batch 에서 아무런 설정을 하지 않은 상태로, job 을 정의하고, 프로젝트를 수행하게 되면 모든 Job 이 수행되는 것을 확인할 수 있다.

spring batch 는 properties 를 통해 특정 job 만 수행하도록 변경할 수 있다.

spring:
	batch:
	    job:
        	names: ${job.names:null}

위와 같이 설정을 하게되면, jar file 을 수행할 때, --job.names=[jobName] 과 같이 특정 job 만 수행할 수 있다.

profile
매일 발전하는 Backend 개발자

0개의 댓글