
이전 글 - 스프링 배치 기초 세팅
오늘의 실습
1. Tasklet 구현체를 생성한다.
2. @Configuration을 통해서 생성할 배치 빈을 스프링에 등록한다.
3. Job, Step 을 생성하고 빈에 등록한다.
4. 실행 결과를 확인한다.
GreetingTask.java 클래스를 만들어 아래의 코드를 작성해주었다.
package com.example.springbatch;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.InitializingBean;
@Slf4j
public class GreetingTask implements Tasklet, InitializingBean {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
log.info("------------------ Task Execute -----------------");
log.info("GreetingTask: {}, {}", contribution, chunkContext);
return RepeatStatus.FINISHED;
}
@Override
public void afterPropertiesSet() throws Exception {
log.info("----------------- After Properites Sets() --------------");
}
}
GreetingTask는 Spring Batch의 Tasklet 인터페이스와 Spring의 InitializingBean 인터페이스를 구현한 클래스이다.
Tasklet : Spring Batch의 작업(Task)을 정의하는 인터페이스InitializingBean: 스프링 빈의 생명주기에서 빈이 모든 프로퍼티 설정을 마치면 호출되는 afterPropertiesSet 메서드를 구현할 수 있도록 하는 인터페이스Tasklet 인터페이스에 정의된 메서드로 execute 메서드 안에서 태스크가 실행된다.
execute 메서드의 파라미터
StepContribution: 현재 실행 중인 스텝에 대한 상태를 담고 있는 객체
ChunkContext: 청크(작업의 묶음)에 대한 정보를 담고 있는 객체
execute 메서드의 반환값 =>
RepeatStatus
FINISHED: Tasklet이 종료되었음을 나타낸다.CONTINUABLE: 계속해서 태스크를 수행하도록 한다.continueIf(condition): 종료/지속을 결정한다.
InitializingBean 인터페이스에 정의된 메서드로 스프링 빈이 생성되고 모든 설정이 완료된 후 자동으로 호출되는 역할을 한다.
BasicTaskJobConfiguration.java 클래스를 만들어 스프링 컨테이너에 배치 관련 빈을 등록해주었다.
package com.example.springbatch.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
@Slf4j
@Configuration
public class BasicTaskJobConfiguration {
// 3번에서 여기에 코드 작성할거임
}
BasicTaskJobConfiguration은 Spring Batch에서 배치 작업(Task)을 설정하기 위해 사용되는 클래스이다
이제 BasicTaskJobConfiguration클래스 안에 Job과 Step을 생성하고 빈으로 등록해보자.
package com.example.springbatch.config;
import com.example.springbatch.GreetingTask;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
@Slf4j
@Configuration
public class BasicTaskJobConfiguration {
@Autowired
PlatformTransactionManager transactionManager;
@Bean
public Tasklet greetingTasklet() {
return new GreetingTask();
}
@Bean
public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
log.info("------------------ Init myStep -----------------");
return new StepBuilder("myStep", jobRepository)
.tasklet(greetingTasklet(), transactionManager)
.build();
}
@Bean
public Job myJob(Step step, JobRepository jobRepository) {
log.info("------------------ Init myJob -----------------");
return new JobBuilder("myJob", jobRepository)
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}
}
Spring Batch의 Step을 정의하는 메서드이다.
Step은 배치 작업에서 실제 실행되는 하나의 단계를 의미하며, 이 단계에서 Tasklet을 실행하게된다.
PlatformTransactionManager가 필요하다.StepBuilder를 통해 Step을 생성하며, myStep이라는 이름을 부여, 이를 jobRepository에 등록한다.Spring Batch의 Job을 정의하는 메서드이다.
Job은 배치 작업의 전체적인 흐름을 관리하는 역할을 한다.
JobBuilder를 동해서 이름이 myJob인 잡을 생성한다.RunIdIncrementer를 사용하여 매번 실행될 때마다 고유의 실행 ID를 부여하여 유니크한 잡을 실행할 수 있게한다.start(step)은 위에서 정의한 Step을 Job의 시작 단계로 설정한다.이제 스프링부트 어플리케이션을 시작해보자!

afterPropertySet(), Job, Step, Tasklet 순으로 실행됨을 확인할 수 있다.
Spring Batch는 다음과 같은 아키텍처를 가진다.

JobLauncher: 배치 작업을 시작하는 주체로 사용자가 작업을 실행하고자 할 때, JobLauncher를 통해 요청한다.
Job: 배치 작업의 전체 흐름을 정의하는 단위로 여러 개의 Step으로 구성될 수 있다.
Step: Job의 하위 단위로, 실제 배치 처리를 수행하는 단위이다.
각각의 Step은 ItemReader, ItemProcessor, ItemWriter를 사용하여 데이터를 처리한다.
ItemReader: 소스 데이터(예: 데이터베이스, 파일 등)를 읽어오는 역할
ItemProcessor: ItemReader에서 읽은 데이터를 처리하는 역할
ItemWriter: 처리된 데이터를 실제로 출력하는 역할
JobRepository : 배치 작업의 메타데이터 및 실행 정보를 저장하고 관리한다.

JobScheduler가 배치를 트리거하면JobLauncher가 실행JobLauncher는JobExecution을 통해 Job을 실행하고 Execution Context 정보를 사용- Job은 정의된 Step을 실행하며,
StepExecution이 수행되고 Execution Context 정보가 전달- Step은 Chunk 모델로 처리
ItemReader가 데이터 읽기ItemProcessor가 데이터 처리ItemWriter가 결과 기록
JobLauncher는 JobRepository에 JobInstance 정보를 저장JobExecution이 Job을 수행하고JobRepository에 실행 정보를 저장JobStep은 JobRepository에 I/O 레코드와 상태정보를 저장- Job이 완료되면 완료 정보를
JobRepository에 저장
JobInstance : Job의 이름과 파라미터를 정의하고 중단 시 다음 실행을 지원
JobExecution: Job의 물리적 실행을 나타내며, JobInstance와 1(JobInstance):N(JobExecution) 관계
ExecutionContext: JobExecution 에서 처리 단계와 같은 메타 정보 공유
StepExecution: Step의 물리적 실행을 나타내며, Job과 1(Job):N(Step) 관계
JobRepository: 배치 실행 정보와 결과를 데이터베이스에 저장
지금까지 Tasklet을 만들어 SpringBatch 실행하는 방법과 SpringBatch 아키텍처에 대해 알아보았다.
참고글 - [SpringBatch 연재 02] SpringBatch 코드 설명 및 아키텍처 알아보기
깃허브 - https://github.com/hysong4u/springbatch