Spring boot batch + gradle, SchedulingConfigurer 배치 간단하게 사용하기
안녕하세요.
오늘은 간단하게 Spring boot 배치 처리 방법을 공유하려고 합니다.
프로젝트의 개발 환경입니다.
- Eclipse
- Spring Boot 2.2.4
- java 8
- Gradle
- Lombok
위 기반으로 간단하게 배치하는 방법을 공유하겠습니다.
1. 간단한 배치처리
웹서비스를 운영하다보면 회원가입 된 사용자를 휴먼사용자로 전환하거나 게시판의 예를 들면 공지사항의 날짜가 임박한 게시물을 일반 게시물로 업데이트해야 하는 경우가 있습니다.
이러한 일들을 사람의 손으로 반복적으로 해야 한다면 자원과 비용의 낭비가 엄청날 것입니다.
Spring Boot 에서는 이러한 일괄 처리를 안정적으로 지원해주는 배치 애플리케이션을 사용합니다.
Spring Boot 에서는 단순반복작업을 쉽고 빠르게 자동화 시켜주고 대용량이라고 할지라도 최적화된 성능을 보장합니다.
예측하지 못한 상황이나 동작에 대한 예외처리는 물론 공통적인 작업을 단위별로 재사용할 수 있습니다.
배치에 관련해서는 복잡한 로직을 피하고 처리해야하는 데이터에 대한 예외상황이 발생되지 않도록 무결성을 보장해야 합니다.
네트워크 비용을 줄여야 하며 이력관리 또는 통계관리를 할 수 있어야 합니다.
스프링부트 배치의 기본 시나리오는 Read, Processing, Write 즉 읽고 처리하고 저장합니다.
이미지 출처 : 노트북을 열고. ahndy84 님의 티스토리 블로그
ItemReader : 배치 데이터를 읽어오는 인터페이스 입니다. DB뿐 아니라 File, XML 등 다양한 타입에서 읽어올 수 있습니다.
ItemProcessor : 읽어온 데이터를 가공/처리합니다. 즉, 비즈니스 로직을 처리합니다.
ItemWriter : 처리한 데이터를 DB(또는 파일)에 저장합니다.
2. 사용방법
- build.gradle 파일 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-batch'
- SchedulerConfig.java 파일 추가
스프링 부트에서 설정을 통해 Schedule에 대한 쓰래드 풀을 생성하고 그 쓰레드 풀을 사용하여 모든 스케줄 된 작업을 실행하도록 할 수 있습니다.
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
private final int POOL_SIZE = 10;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
threadPoolTaskScheduler.setThreadNamePrefix("my-scheduled-task-pool-");
threadPoolTaskScheduler.initialize();
scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
}
- taskSchedule.java 파일 추가
그 전에crontab 주기설정 방법부터 알아보자. * * * * * * 초(0-59) 분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7) 각 별 위치에 따라 주기를 다르게 설정 할 수 있다. 순서대로 초-분-시간-일-월-요일 순이다. 그리고 괄호 안의 숫자 범위 내로 별 대신 입력 할 수도 있다. 요일에서 0과 7은 일요일이며, 1부터 월요일이고 6이 토요일이다.
@Component
public class Scheduler {
@Scheduled(cron = "0 * 9 * * ?")
public void cronJobSch() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date now = new Date();
String strDate = sdf.format(now);
System.out.println("Java cron job expression:: " + strDate);
}
}
- Thread pool 설정
logger.info("Current Thread : {}", Thread.currentThread().getName());
- 결과
스케줄이 돌고있는 메소드에서 현재 스레드의 이름을 로깅하면 아래와 같은 출력이 표시됩니다.
Current Thread : pool-1-thread-1