Maven 환경에서 Spring Batch MMbot 프로젝트 만들기 1.
Web hook을 이용해서 Mattermost에 알림을 날리는 프로젝트를 시작했다.
정해진 시간마다 알림을 날리는 기능을 위해 Spring Batch를 사용해보기로 했고 간단한 이론이나 진행 과정들을 정리해보려고 한다.
Batch 어플리케이션이란?
Batch == 일괄처리
1. Spring 프로젝트 생성
1-1. Spring Initializr 에 들어가서 Spring 프로젝트 생성
# dependency 추가
- Lombok
- Spring Web
- Spring Security
- Spring Data JDBC
- Spring Data JPA
- MySQL Driver
- H2 Database
1-2. lombok 설치
lombok 다운로드 링크에 들어가서 lombok.jar 파일을 다운로드 받고 Eclipse나 sts처럼 본인이 원하는 곳에 lombok 설치.
IDEs에 자동으로 프로그램이 잡힐 수도 있지만 잡히지 않을 경우 아래 방법을 통해서 직접 exe 파일 위치를 찾아 선택 후 설치.
설치 완료 후 sts/Eclipse 재시작
1-3. 프로젝트 Import
1) Import
File → Import → Maven / Existing Maven Project → Project 선택
2) Rebuild Index
3) Maven Update
2. Simple Job 생성
2-1. @EnableBatchProcessing 어노테이션 추가
Spring Batch 어플리케이션을 사용하기 위해 MmbotApplication.java에 @EnableBatchProcessing 추가(필수)
2-2. SimpleJobConfiguration.java 파일 생성
com.ssafy.mmbot 패키지 아래에 config 패키지를 생성하고 SimpleJobConfiguration.java 파일 추가
2-3. SimpleJobConfiguration.java
-
JOB
- 하나의 배치 작업 단위
- JOB 안에는 여러 Step이 존재하고, Step 안에 Tasklet이나 Reader & Processor & Writer 묶음이 존재한다.
-
jobBuilderFactory.get(BATCH_NAME)
SSAFY_MM_BOT
이라는 이름의 Batch Job 생성
-
stepBuilderFactory.get(BATCH_NAME + " Step1")
SSAFY_MM_BOT Step1
이라는 이름의 Batch Step 생성
-
.tasklet((StepContribution, chunkContext))
- Step 안에서 단일로 수행될 커스텀한 기능들을 선언
- 여기서는 Batch가 수행되면 log.info()가 출력되도록 설정
package com.ssafy.mmbot.config;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
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.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequiredArgsConstructor
@Configuration
public class SimpleJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
private final String BATCH_NAME = "SSAFY_MM_BOT";
@Bean
public Job job() {
return jobBuilderFactory.get(BATCH_NAME)
.start(step1())
.next(step2())
.build();
}
@Bean
@JobScope
public Step step1() {
return stepBuilderFactory.get(BATCH_NAME + " Step1")
.tasklet((StepContribution, chunkContext) -> {
log.info(">>>>>" + (BATCH_NAME + "Step1 Started"));
return RepeatStatus.FINISHED;
}).build();
}
@Bean
@JobScope
public Step step2() {
return stepBuilderFactory.get(BATCH_NAME + " Step2")
.tasklet((StepContribution, chunkContext) -> {
log.info(">>>>>" + (BATCH_NAME + "Step2 Started"));
return RepeatStatus.FINISHED;
}).build();
}
}
2-4. 프로젝트 Run
- 오른쪽 버튼 → Run as Spring App
- 현재 DB가 설정된게 없으므로 default값인 h2로 실행된다.