배치란?
배치작업은, 데이터를 실시간으로 처리하는게 아니라, 일괄적으로 모아서 처리하는 작업을 의미한다. 가령, 하루동안 쌓인 데이터를 배치작업을 통해 특정 시간에 한꺼번에 처리하는 경우가 이에 해당한다. 은행의 정산작업과 같은 업무에서 이런 일괄처리를 수행하게 되며 사용자에게 빠른 응답이 필요하지 않은 서비스에 적용할 수 있다.
특정 시간이후에는 자원을 거의 소비하지 않는 것이 특징이다.
- 큰 단위의 작업을 일괄 처리
- 대부분 처리량이 많고 비 실시간성 처리에 사용
- 대용량 데이터 계산, 정산, 통계, 데이터베이스, 변환 등
- 컴퓨터 자원을 최대로 활용
- 컴퓨터 자원 사용이 낮은 시간대에 배치를 처리하거나
- 배치만 처리하기 위해 사용자가 사용하지 않는 또 다른 컴퓨터 자원을 사용
- 사용자 상호 작용으로 실행되기 보단, 스케줄러 와 같은 시스템에 의해 실행되는 대상
- 예를 들면 매일 오전 10시에 배치 실행, 매주 월요일 12시 마다 실행
스프링 배치란?
- 배치 처리를 하기 위한 Spring Frameword 기반 기술
- Spring에서 지원하는 기술 적용 기능
- DI,AOP, 서비스 추상화
- 스프링 배치의 실행 단위인 Job과 Step
- 비교적 간단한 작업(Tasklet) 단위 처리와, 대량 묶음 (Chunk) 단위 처리
스프링 배치 시작하기
build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.batch:spring-batch-test'
}
전형적인 Spring Boot 코드에 @EnableBatchProcessing 어노테이션을 붙여줍니다.
그럼 이제 간단한 Spring Batch Job을 생성해보겠습니다.
Hello spring batch 생성하기
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
@Slf4j
public class HelloConfiguration {
/**
* 스프링 배치 설정에 의해서 빈으로 생성되어 있다.
*/
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
public HelloConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
this.jobBuilderFactory = jobBuilderFactory;
this.stepBuilderFactory = stepBuilderFactory;
}
/**
* RunIdIncrementer : 잡이 실행될때마다 파라미터아이디를 생성해주는 클래스이다.
* @return
*/
@Bean
public Job helloJob() {
return jobBuilderFactory.get("helloJob")
.incrementer(new RunIdIncrementer())
.start(this.helloStep())
.build();
}
@Bean
public Step helloStep() {
return stepBuilderFactory.get("helloStep")
.tasklet(((contribution, chunkContext) -> {
log.info("hello spring batch");
return RepeatStatus.FINISHED;
})).build();
}
}
@RequiredArgsConstructor 어노테이션을 활용하면 생성자코드를 줄일수 있습니다.
- @Configuration
- Spring Batch의 모든 Job은 @Configuration으로 등록해서 사용합니다.
- jobBuilderFactory.get("helloJob")
- helloJob이란 이름의 Batch Job을 생성합니다.
- job의 이름은 별도로 지정하지 않고, 이렇게 Builder를 통해 지정합니다.
- stepBuilderFactory.get("helloStep")
- helloStep 이란 이름의 Batch Step을 생성합니다.
- jobBuilderFactory.get("helloJob")와 마찬가지로 Builder를 통해 이름을 지정합니다.
- .tasklet((contribution, chunkContext))
- Step 안에서 수행될 기능들을 명시합니다.
- Tasklet은 Step안에서 단일로 수행될 커스텀한 기능들을 선언할때 사용합니다.
- 여기서는 Batch가 수행되면 log.info("hello spring batch") 가 출력되도록 합니다.
실행하면 hello spring batch 로그가 찍히는 모습입니다.
보통 모든 잡을 동시에 실행시키지는 않을텐데 내가 원하는 잡만 실행시키고 싶으면 아래와 같이 하면 됩니다.
스프링배치에서는 잡을 실행할수있는 설정값을 제공해줍니다.
그래서 스프링 배치에서는 내가 원하는 잡만 실행시킬수가 있습니다.
그렇게 하기 위해서는 오른쪽 상단에 Edit Configurations...를 눌러줍니다.
그럼 이런 창이 뜨는데요 Program arguments 에 --spring.batch.job.names=helloJob 이렇게 스프링 배치에서 제공되는 설정 값을 적어주면 위에서 설정한 job의 이름을 찾아서 그 잡만 실행시켜줍니다. Program arguments 칸이 없을시에는 Modify options -> program arguments 체크를 해줍니다.
하지만 위와 같이 설정이 안되어있을경우 모든 배치가 실행되게 됩니다. 그래서 application.yml의 설정을 해주어야 합니다.
application.yml
spring:
batch:
job:
names: ${job.name:NONE}
이렇게 설정을 하면 job.name 파라미터로 잡을 실행 시킬 수 있게 됩니다.
Edit Configurations
hello spring batch 로그가 잘 찍히는 모습입니다.
JobRepositoy
db또는 메모리에 스프링배치가 실행할 수 있도록 배치 메타데이터로 관리하는 클래스입니다.
메타데이터는 나중에 더 자세히 알아보겠습니다.
Job
job은 JobLauncher에 의해 실행
Job은 배치의 실행 단위를 의미
Job은 N개의 Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있다.
예를들면, A Step 실행 후 조건에따라 B Step 또는 C Step을 실행 설정 할 수있다.
Step
Step은 Job의 세부 실행 단위이며, N개가 등록돼 실행된다.
Step의 실행 단위는 크게 2가지로 나눌 수 있다.
1. Chunk 기반 : 하나의 큰 덩어리를 n개씩 나눠서 실행
2. Task 기반 : 하나의 작업 기반으로 실행
Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter가 있습니다.
여기서 Item은 배치 처리 대상 객체를 의미합니다.
ItemReader는 배치 처리 대상 객체를 읽어 ItemProcessor 또는 ItemWriter에게 전달합니다.
예를들면 파일 또는 DB에서 데이터를 읽어옵니다.
ItemProcessor는 input 객체를 output 객체로 filtering 또는 processing 해 ItemWriter에게 전달합니다.
예를들면, ItemReader에서 읽은 데이터를 수정 또는 ItemWriter대상인지 filtering합니다.
ItemProcessor는 optional 합니다.
ItemProcessor가 하는 일은 ItemReader 또는 ItemWriter가 대신할 수 있습니다.
ItemWriter는 배치 처리 대상 객체를 처리합니다.
예를들면 DB update를 하거나 , 처리 대상 사용자에게 알림을 보냅니다.
'Spring Boot > Batch' 카테고리의 다른 글
[Batch] ItemWriter 데이터 쓰기 (0) | 2022.08.08 |
---|---|
[Batch] ItemReader (JDBC,JPA) (0) | 2022.08.08 |
[Batch] Execution 데이터 공유 (0) | 2022.07.28 |
[Batch] 메타데이터, 메타 테이블 (0) | 2022.07.28 |
댓글