이전 글 - 스프링 배치 기초 세팅
오늘의 실습
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