1) Batch(배치) 란?
Spring Batch는 대량 데이터 처리에 최적화된 프레임워크입니다. 복잡한 데이터 변환, 처리 및 전송 작업에 적합합니다. 배치 작업이 장애로 인해 실패한 경우, 다시 시작할 수 있는 기능이 있습니다. 이 경우에는 데이터 삭제 작업이 단순한 작업이라도 복잡한 전처리가 필요하지 않으므로 Spring Batch를 사용하기에는 과도한 기능을 가지고 있을 수 있습니다.
2) Scheduler(스케쥴러) 란?
Spring Scheduler는 일정 간격으로 작업을 실행하는 스케줄링 기능을 제공합니다. 크론표현식을 사용하여 스케줄을 설정할 수 있으며, 작업이 간단할 때 사용하기에 적합합니다. 이 경우, 단순한 데이터 삭제 작업을 반복적으로 수행하기 때문에 Spring Scheduler가 더 적절한 선택일 수 있습니다.
3) 사용목적에 따라 다른 예시
spring boot 환경에서 일정시간마다 DB의 불필요한 데이터를 삭제하는 작업 → 스케쥴러
하지만 향후 프로젝트에서 더 복잡한 배치 처리 작업이 필요하다면 Spring Batch를 고려해 볼 수 있습니다.
4) Scheduler 사용법
나같은 경우는 Spring boot 에서 사용하고있는데 이때 Spring boot 의 Application.java 파일에서 어노테이션으로 꼭
@EnableScheduling
를 붙여야한다!!!!
fixedDelay
- 해당 메서드가 끝나는 시간 기준, 밀리세컨드 간격으로 실행
@Scheduled(fixedDelay = 1000) // 1초마다 실행
public void run(){
System.out.println("fixedDelay");
}
fixedDelayString
- fixedDelay 와 같은데 문자열로 값을 표현한다는 의미이다.
- ex) fixedDelay = "1000"
fixedRate
- 해당 메서드가 시작하는 시간 기준, 밀리세컨드 간격으로 실행
@Scheduled(fixedRate = 1000)
public void run1(){
System.out.println("fixedRate");
}
fixedRateString
- fixedRate 와 같은데 문자열로 값을 표현한다는 의미이다.
- ex) fixedRate = "1000"
※ fixedDelay 는 작업과 상관없이 실행이되고, fixedRate 는 작업이 끝난후를 기준으로 잡기때문에 구분 잘해야됨!!
5) Cron 표현식
@Scheduled(cron = "* * * * * *")
public void run() {
System.out.println("cron");
}
첫 번째 * 부터
1 : 초(0-59)
2 : 분(0-59)
3 : 시간(0-23)
4 : 일(1-31)
5 : 월(1-12)
6 : 요일(0-6) (0: 일, 1: 월, 2:화, 3:수, 4:목, 5:금, 6:토) → 7도 있는데 7은 일요일을 뜻한다.
* : 모든조건(ALL)을 의미
? : 설정 값 없을 때(어떠한 값이든 상관없음) (날짜와 요일에서만 사용 가능)
- : 범위값을 지정할 때 사용
, : 여러값을 지정할 때 사용
/ : 초기값과 증가치를 설정할 때 사용
L : 마지막 - 지정할 수 있는 범위의 마지막 값 설정할때 사용(날짜와 요일에서만 사용 가능)
W : 가장 가까운 평일 찾음
private static final Logger logger = LoggerFactory.getLogger(TaskScheduler.class);
private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
// 매일 15시 30분 10초에 실행되는 스케줄 작업
@Scheduled(cron = "10 30 15 * * *")
public void run() {
System.out.println("매일 15시 30분 10초에 실행");
}
// 매일 00:00에 실행되는 스케줄 작업
@Scheduled(cron = "0 0 0 * * ?")
public void run1() {
logger.info("Daily Task :: Execution Time - {}", dateTimeFormatter.format(LocalDateTime.now()));
}
// 매일 오후 3시에 실행되는 스케줄 작업
@Scheduled(cron = "0 0 15 * * ?")
public void scheduleDailyTaskAt3PM() {
logger.info("Daily Task at 3 PM :: Execution Time - {}", dateTimeFormatter.format(LocalDateTime.now()));
// 여기에 작업을 구현합니다.
}
// 5분마다 실행되는 스케줄 작업
@Scheduled(fixedRate = 300000)
public void scheduleTaskEvery5Minutes() {
logger.info("Task every 5 minutes :: Execution Time - {}", dateTimeFormatter.format(LocalDateTime.now()));
// 여기에 작업을 구현합니다.
}
// 매주 일요일 오후 4시에 실행되는 스케줄 작업
@Scheduled(cron = "0 0 16 ? * SUN")
public void scheduleTaskEverySunday() {
logger.info("Weekly Task on Sundays at 4 PM :: Execution Time - {}", dateTimeFormatter.format(LocalDateTime.now()));
// 여기에 작업을 구현합니다.
}
'Framework > Spring😊' 카테고리의 다른 글
[error] setattribute non-serializable attribute (0) | 2021.11.19 |
---|---|
[SPRING] MYBATIS, JDBC 차이 (0) | 2021.11.03 |
[error]java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver 뜰 경우 (0) | 2020.10.18 |
[Spring] status.setComplete() (0) | 2020.10.18 |
[Spring] Spring framework 란 (0) | 2020.10.18 |