본문 바로가기
카테고리 없음

230330 TIL

by hbIncoding 2023. 3. 31.

1.  Spring batch 설정

 1)Bulid.gradle에 dependency 추가

implementation 'org.springframework.boot:spring-boot-starter-batch'

 2)application.properties에 annotation 설정

@EnableBatchProcessing
@SpringBootApplication
public class SpringBatchApplication {

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

}

 3)Simple Batch 코드 작성

@Slf4j
@RequiredArgsConstructor
@Configuration // Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용해야 한다.
public class SimpleJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
            .start(simpleStep1())
            .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1")
            .tasklet((contribution, chunkContext) -> {
                log.info(">>>>> This is simpleStep1");
                return RepeatStatus.FINISHED;
            })
            .build();
    }

}

4)DB 별 기초 설정(BATCH_JOB_INSTANCE)

  • Spring Batch에선 메타 데이터 테이블들이 필요하다. 이것이 없다면 위와 같은 에러가 발생한다.
  • 메타 데이터는 다음과 같은 내용을 담는다.
    • 이전에 실행한 Job이 어떤 것들이 있는지
    • 최근 실패한 Batch Parameter가 어떤 것들이 있고, 성공한 Job은 어떤 것들이 있는지
    • 다시 실행한다면 어디서 부터 시작하면 될지
    • 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step들은 어떤 것들이 있는지
  • H2의 경우 boot 실행시 자동으로 생성해준다
  • MySQL이나 Oracle과 같은 DB 사용시에는 직접 생성해줘야 한다.
  • MySQL의 경우 다음과 같다
    • 아까 추가한 Spring Batch 라이브러리에 org.springframework.batch.core 폴더에 들어간뒤
      org>springframework>batch>core를 보면 schema-mysql.sql파일이 있다.
    • 이것을 query console을 통해 실행시켜 주면 된다.
  • 이제 정상적으로 Job이 실행된다.

2.  Spring batch 작동 확인

 1)코드 작성

package com.baechu.batch;

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.JobScope;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJobConfiguration {

	private final JobBuilderFactory jobBuilderFactory;
	private final StepBuilderFactory stepBuilderFactory;

	@Bean
	public Job simpleJob(){
		return jobBuilderFactory.get("simpleJob")
			.start(simpleStep1(null))
			.build();
	}

	@Bean
	@JobScope
	public Step simpleStep1(@Value("#{jobParameters[needDate]}") String needDate){
		return stepBuilderFactory.get("simpleStep1")
			.tasklet(((contribution, chunkContext) -> {
				log.info(">>>>> This is Step1");
				log.info(">>>>> requestDate = {}", needDate);
				return RepeatStatus.FINISHED;
			}))
			.build();
	}

}
  • 위에서 사용하는 @Value는 lombok꺼를 사용하는 것이 아니다.
  • 아래와 같이 beans.factory.annotation을 사용하도록하자.
  • 만약 lombok꺼를 사용했다면 작동도 잘 안되고 querydsl과 충돌하여 querydsl을 다시 컴파일 해주어야하는 문제가 발생한다.

  • Edit Configurations > Program Argument > needDate=20230401 (현재날자)를 입력하자.

 2)작동 확인

  • 실행하면 위와 같이 동작 됨을 확인 할 수 있다.
  • 그리고 아래와 같이 DB에 들어가면 batch의 job과 step에 대한 실행 이력을 확인 가능하다.

batch_job_execution

  • batch_step_excution도 확인 가능하지만 사진은 패스함

 

 

 

 

 

 

 

3.  참조

 1)Spring batch 기초 설정 : https://devbksheen.tistory.com/284

 

스프링 배치(Spring Batch)란? 소개 및 예제

스프링 배치(Spring Batch)란? Spring Batch는 엔터프라이즈 시스템의 운영에 있어 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크다. Spring의 특성을 그대로 가져왔기 때문에

devbksheen.tistory.com