Spring Batch를 이용한 기본적인 Batch Application
2018.02.08 10:54
Spring Batch를 이용한 기본적인 Batch Application
Spring Boot Batch(Maven Repository의 artifact id가 spring-boot-starter-batch)를 기준으로 작성하였음 ㅎㅎ
Spring Batch는 Job과 Step으로 구성되어 있다. 하나의 배치 어플리케이션 안에 여러개의 Job이 있고, 다시 하나의 Job은 여러개의 Step으로 구성되어있는 구조이다. Step은 ItemReader, ItemProcessor, ItemWriter 빈을 하나씩 가지고 있거나, 이런 전형적인 구조가 아닐 경우, Tasklet 빈을 가질 수도 있다.
우선 메인 애플리케이션 클래스를 작성한다.
@SpringBootApplication
public class BatchApplication {
public static void main(String[] args){
SpringApplication.run(BatchApplication.class, args);
}
}
@SpringBootApplication 어노테이션으로 Spring Boot의 기본 어플리케이션을 생성한다.
다음 Job을 생성한다.
@Configuration
@EnableBatchProcessing
public class JobConfiguration {
private static final String JOB_NAME = "jobName";
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private Step stepName;
@Bean
public Job job() {
return jobBuilderFactory.get(JOB_NAME)
.start(StepName)
.build();
}
}
@Configuration 어노테이션으로 설정 파일임을 명시하고, @EnableBatchProcessing 어노테이션으로 Job 생성에 필요한 핀들을 자동으로 가져온다.
Job을 생성하기 위해서 JobBuilderFactory를 가져오고, Job에 들어갈 Step도 가져온다.
Step 파일을 따로 만들경우, 해당 Step 이름으로 자동 주입시키면 되고, 아니면 Job 설정 파일에 Step 빈을 같이 설정해도 무관하다.
본인은 다음과 같이 Step 설정 클래스를 따로 작성하였다.
@Configuration
public class StepConfiguration {
private static final String STEP_NAME = "StepName";
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step Step() {
return stepBuilderFactory.get(STEP_NAME)
.<InputType, OutputType>chunk(1)
.reader(sampleItemReader())
.processor(sampleItemProcessor())
.writer(sampleItemWriter())
.build();
}
@Bean
public ItemReader<InputType> sampleItemReader() {
MyBatisPagingItemReader<InputType> reader = new MyBatisPagingItemReader<InputType>();
reader.setSqlSessionFactory(sqlSessionFactory);
reader.setQueryId("mapper.package.path.MapperClass.MethodName");
return reader;
}
@Bean
public ItemProcessor<InputType, OutputType> sampleItemProcessor() {
return new SampleItemProcessor();
}
@Bean
public ItemWriter<OutputType> sampleItemWriter() {
MyBatisBatchItemWriter<OutputType> writer = new MyBatisBatchItemWriter<OutputType>();
writer.setSqlSessionFactory(sqlSessionFactory);
writer.setStatementId("mapper.package.path.MapperClass.MethodName");
return writer;
}
}
우선 Step을 생성하기 위해 StepBuilderFactory도 주입한다. 그리고 본인은 현재 Mybatis를 사용하고 있으므로 SqlSessionFactory를 주입한다. JPA를 쓸 경우에는 EntityManagerFactory를 주입하면 된다.
chunk 는 하나의 트랜잭션 안에서 처리할 read의 단위를 설정한다. 3이라면 3개의 아이템을 하나의 트랜잭션 안에서 읽은 후 한번에 write하게 된다.
Mybatis를 이용하는 경우에는 예제 처럼 Mybatis를 지원하는 ItemReader와 ItemWriter를 사용하면 편하다. (Spring Batch의 입출력은 여러 DB 플랫폼 혹은 파일 같은 다양한 수단을 지원한다)
ItemProcessor는 정의하지 않는 경우에는 ItemReader에서 바로 ItemWriter로 넘어가게 된다. 로직을 추가할 필요가 있는 경우에는 ItemProcessor 인터페이스를 구현하고 process() 메소드를 오버라이드 해서 구현하면 프로세서를 거쳐가게 된다.
여기까지 하면 기본적인 Job-Step 설정이 완료 된다. Gradle이나 Maven 등으로 빌드하여 jar 파일을 실행하면 설정한 Job이 돌아가게 된다. 만약에 만든 애플리케이션에 Job이 여러개 있는 경우 다음과 같이 특정 Job 이름을 지정(콤마로 구분)해서 실행해 줄 수 있다.
java -jar path/of/jar/batch.jar --spring.batch.job.names=jobName1,jobName2…
주의 : 애플리케이션 안에 Job-Step-Reader-Processor-Writer가 여러개일 경우 빈 이름을 모두 다르게 지어야 엉뚱한 빈이 주입되는 일이 일어나지 않는다. Reader-Processor-Writer의 경우 메소드 이름으로 구별하면 된다.
끝!
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

