https://fitchan.tistory.com/44
Spring Batch 란?
우선 배치는 대용량 트래픽을 한번에 처리하는 것을 의미한다. 어떤 예시들이 있을까? 이메일 쿠폰 발송 가맹점 정산 거래 명세서 생성 추천 시스템 데이터 작업 매번 정산에 변경이 생길 때마
fitchan.tistory.com
전 Spring Batch 에 대한 포스팅에 대해 정리 하자면.
1. SpringBatch 는 일괄적으로 대용량 트래픽을 정기적으로 처리하는데 사용된다. ex)) 정산
즉, 배치는 특정 주기마다 데이터를 처리하는 작업. for 시스템 효율
2. JobRepository , JobLauncher, Job , Step 으로 단계가 나뉜다.
3. Job 은 수행단위를 이야기하며 하나의 Job에는 최소 1개 이상의 Step 단계를 설정할 수 있다.
우선 Job 과 Step 을 설정하는데 있어 정리는 해보도록 하자.
의존성
Spring프로젝트를 새로 하나 생성하면서 다음의 의존성을 추가한다.
DB
cmd창을 통해
>mysql -u root -p
>password : 여기 입력
로그인후
새로운 DB 생성 이후 프로잭트와 연동
(연습 하실때는 굳이 안하셔도 됩니다. 그저 Mysql에 정보가 저장되는 것을 보려는 것입니다.)
ex))
yaml
spring :
batch:
job:
names: ${job.name:NONE} #job을 셋팅 할떄 job 이름을 파라미터로 넘길때 이렇게 설정함
jdbc:
initialize-schema: always
datasource:
url : jdbc:mysql://127.0.0.1:3306/본인DB이름적을것
driver-class-name: com.mysql.cj.jdbc.Driver
username : root
password : 본인 패스워드 적을것.
jpa:
show-sql: true
확인해야할 부분 names : ${job.name : NONE} 여기는 앞으로 JOB을 리턴으로 받는 매소드의 이름을 파라미터로 넘겨
Spring Batch를 실행시키도록 하는 것이다. 설정 방법은 이따 설명할 것임.
Application Run
@SpringBootApplication 이외에
@EnableBatchProcessing 을 추가해야한다. 이로써 Batch 프로그램이 실행된다.
JAVA 코드 및 Method 설명
새로운 클래스를 하나 생성한다.
1. Job 과 Step 은 Builder패턴으로 설정한다.
2. 이때 Builder 패턴으로 사용되는 클래스는.
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
이다.
3. 모든 Job 과 Step 은 @Bean으로 등록한다.
4. 클래스에 @Configuration 어노테이션을 추가한다.
코드
김밥천국 모티브로 한번 만들어보자 .
Job에 대해서 먼저 만들어 줘야한다.
우리의 Job은
@Configuration
@RequiredArgsConstructor
public class RamenHouse {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job chef(){
return jobBuilderFactory.get("chef")
.incrementer(new RunIdIncrementer())
.start(gimbob())
.next(ramen())
.next(icenoodle())
.build();
}
}
우리는 gimbob() 메소드로 시작해서 -> ramen() -> icenoodle() 로 일을 처리할 예정입니다.
incrementer(new RunIdIncrementer())은 우리가 아까 DB에 연결한 것입니다.
@Id 정도로만 이해하고 있습니다.
gimbob() 은 Step 입니다.
@JobScope
@Bean
public Step gimbob() {
return stepBuilderFactory.get("gimbob")
.tasklet(makeGimbob())
.build();
}
이렇게 stepBuilderFactory로 생성을 하게 되는데 tasklet() 으로 할일을 설정하여줍니다.
@JobScope를 확인해주세요
@StepScope
@Bean
public Tasklet makeGimbob() {
return (contribution, chunkContext) -> {
System.out.println("김밥이 완료 되었습니다.");
return RepeatStatus.FINISHED;
};
}
@StepScope를 확인해주세요
"김밥이 완료 되었습니다." 가 나오도록 설정하고 Finish 하였습니다.
이렇게 나머지 라면과 냉면을 만들어주면
이런 코드가 나옵니다.
package com.example.springbatchtutorial.job.HelloWorld;
import lombok.RequiredArgsConstructor;
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.core.configuration.annotation.StepScope;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RequiredArgsConstructor
public class RamenHouse {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job chef(){
return jobBuilderFactory.get("chef")
.incrementer(new RunIdIncrementer())
.start(gimbob())
.next(ramen())
.next(icenoodle())
.build();
}
@JobScope
@Bean
public Step icenoodle() {
return stepBuilderFactory.get("icenoodle")
.tasklet(makeIcenoodle())
.build();
}
@StepScope
@Bean
public Tasklet makeIcenoodle() {
return (contribution, chunkContext) -> {
System.out.println("냉면이 완료 되었습니다.");
return RepeatStatus.FINISHED;
};
}
@JobScope
@Bean
public Step ramen() {
return stepBuilderFactory.get("ramen")
.tasklet(makeRamen())
.build();
}
@StepScope
@Bean
public Tasklet makeRamen() {
return (contribution, chunkContext) -> {
System.out.println("라면이 완료 되었습니다.");
return RepeatStatus.FINISHED;
};
}
@JobScope
@Bean
public Step gimbob() {
return stepBuilderFactory.get("gimbob")
.tasklet(makeGimbob())
.build();
}
@StepScope
@Bean
public Tasklet makeGimbob() {
return (contribution, chunkContext) -> {
System.out.println("김밥이 완료 되었습니다.");
return RepeatStatus.FINISHED;
};
}
}
Parameters설정
여기서 EditConfiguration 을 해준뒤.
Program arguments 에
--job.name=메소드명
을 설정해줍니다. 우리는
--job.name=chef 입니다.
뒤에 version=1 을 붙여주시고 다음 또 실행하실경우 version=2....3....4...5...중복이 되지 않도록 계속 숫자를 바꿔주셔야합니다. 중복 실행이 되지 않습니다.
version대신 다른 단어로 넣어주셔도됩니다.
apply 이후 실행을 시켯을 경우
이렇게 실행이 되는 것을 알수 있습니다.
다음 시간에는
Job 을 실행시킬때 조건을 넣어서 조금더 체계적으로 실행시키는 법에 대해서 공부해 보도록하겠습니다.
또한 Step에서 실행후 결과에 따른 실행 순서에 대해서도 공부해 볼 예정입니다. 감사합니다.
SpringBatch 스케줄러로 Job실행하기 (0) | 2022.08.19 |
---|---|
SpringBatch ExecutionContext (0) | 2022.08.19 |
Spring Batch DB 데이터 이관하기 (0) | 2022.08.17 |
Spring Batch Listener (0) | 2022.08.16 |
Spring Batch 란? (0) | 2022.08.12 |
댓글 영역