본문 바로가기

프로그래밍

Scheduler

사용 목적

도메인에서 매 시간마다 외부 연동 서비스의 서버로부터 데이터를 받아서
DB에 업데이트를 해야하는 요구사항이 생겼습니다.

사용 방법

  1. 도메인 어플리케이션에 @EnableScheduling 을 추가 설정합니다.
@EnableScheduling
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
  1. 해당 서비스의 메서드를 스케줄링에 등록합니다.
package com.example.demo.batch;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Service
public class SchedulerService {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    @PostConstruct
    public void schedulerTask() {
        // 매 1초 간격으로 실행되는 작업
        scheduler.scheduleAtFixedRate(() -> {
            // 실행하고자 하는 작업
            System.out.println("Task with priority 1 executed every 1 seconds.");
        }, 0, 1, TimeUnit.SECONDS);
    }

}
  1. 어플리케이션을 실행 결과
...
Task with priority 1 executed every 1 seconds.
Task with priority 1 executed every 1 seconds.
Task with priority 1 executed every 1 seconds.

2개 이상의 스케줄링을 등록 시

스레드 풀의 크기를 2로 설정한 경우, 동시에 실행되는 스케줄링 작업은 두 개로 제한됩니다.
따라서 스케줄링 작업의 개수가 스레드 풀 크기보다 크면 스케줄링 작업이 대기열에 들어가게 됩니다.
스케줄링 작업의 수와 스레드 풀의 크기를 어떻게 설정해야 하는지는 애플리케이션의 요구사항과
하드웨어 자원에 따라 다릅니다.

몇 가지 고려 사항은 다음과 같습니다:


스케줄링 작업의 수: 먼저 애플리케이션에서 실행해야 하는 스케줄링 작업의 수를 고려해야 합니다.
만약 동시에 실행되어야 하는 작업이 2개라면 스레드 풀 크기를 2로 설정하는 것이 적합할 수 있습니다.
그러나 작업이 더 많이 추가되면 스레드 풀 크기를 증가시키는 것이 필요할 수 있습니다.

하드웨어 자원: 애플리케이션을 호스팅하는 서버의 CPU 코어 수와 메모리 용량도 고려해야 합니다.
너무 많은 스레드를 생성하면 CPU 및 메모리 부하가 증가하고 성능 문제가 발생할 수 있습니다.
따라서 서버의 하드웨어 스펙에 맞는 스레드 풀 크기를 선택해야 합니다.

스케줄링 작업의 복잡성: 스케줄링 작업이 단순하고 빠른 작업이라면 스레드 풀 크기를 작게 설정해도
괜찮을 수 있습니다. 그러나 복잡한 작업이나 I/O 바운드 작업인 경우 스레드 풀 크기를 늘려야 할 수 있습니다.

스케줄링 작업 간의 의존성: 스케줄링 작업 간에 의존성이 있는 경우, 이를 고려하여 스레드 풀 크기를 조절해야 합니다.

추가적인 스케줄링 작업이 동시에 실행되어야 하는 경우, 스레드 풀 크기를 늘리는 것이 한 가지 옵션이 될 수 있습니다.그러나 이렇게 하면 자원 소비가 늘어날 수 있으므로 신중하게 고려해야 합니다.

 

package com.example.demo.batch;

import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Service
public class SchedulerService {

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);

    @PostConstruct
    public void schedulerTask() {
        // 매 1분 간격으로 실행되는 작업, 우선순위 1
        scheduler.scheduleAtFixedRate(() -> {
            // 실행하고자 하는 작업
            System.out.println("Task with priority 1 executed every 1 second.");
        }, 0, 1, TimeUnit.SECONDS);

        // 매 5분 간격으로 실행되는 작업, 우선순위 2
        scheduler.scheduleAtFixedRate(() -> {
            // 실행하고자 하는 작업
            System.out.println("Task with priority 2 executed every 2 second.");
        }, 0, 2, TimeUnit.SECONDS);
    }

}

 

실행 결과

...
Task with priority 1 executed every 1 minute.
Task with priority 1 executed every 1 minute.
Task with priority 2 executed every 2 minute.
Task with priority 1 executed every 1 minute.
Task with priority 1 executed every 1 minute.
Task with priority 2 executed every 2 minute.

 

 

위 기능을 추가 전 이미 Spring Batch 기능을 도메인에서 사용중이였고 이번 요구사항에서도

Spring Batch를 활용하면 될 줄로만 알았습니다. 그러나 기능 검토 중에 Spring Batch 는 현재 요구사항과

맞지 않는 기능임을 알게 되었습니다.

Spring Batch를 사용하는 상황에 대한 예시 By ChatGPT

Spring Batch는 대규모 데이터 처리 및 배치 작업을 수행하는 데 사용되는 강력한 프레임워크로, 다양한 상황과 업무에서 활용됩니다. 아래는 Spring Batch를 사용하는 몇 가지 예시 상황입니다:

  1. 데이터 마이그레이션: 데이터베이스 플랫폼 변경 또는 데이터 이전 작업 시 Spring Batch를 사용하여 데이터 마이그레이션을 수행할 수 있습니다. 데이터를 추출하고 변환한 다음 새 데이터베이스로 로드하는 작업을 효과적으로 수행할 수 있습니다.
  2. 일일/주간/월간 데이터 처리 및 보고서 생성: 매일, 매주 또는 매월 실행되어야 하는 대규모 데이터 처리 작업, 예를 들어 금융 거래 데이터의 집계 또는 보고서 생성 작업, Spring Batch를 사용하여 자동화할 수 있습니다.
  3. 대량의 파일 처리: 대량의 파일을 읽고 처리하는 작업에서 Spring Batch는 텍스트 파일, CSV 파일, Excel 파일 또는 다른 형식의 파일을 읽고 데이터 처리를 수행하며 결과 파일을 생성하는 데 사용됩니다.
  4. 프로세스 체인 조립: 여러 단계의 작업을 순차적으로 조립하고 실행해야 하는 상황에서 Spring Batch는 복잡한 일괄 처리 워크플로우를 구축하는 데 유용합니다. 예를 들어, 데이터 추출, 데이터 변환, 데이터 유효성 검사, 데이터 저장의 순차적인 프로세스를 구성할 수 있습니다.
  5. 자동화된 스케줄링 및 관리: Spring Batch는 스케줄링 및 관리를 자동화하는 데 사용됩니다. 특정 시간 또는 주기적으로 일괄 처리 작업을 실행하고, 재시도 및 오류 처리를 관리하는 데 도움이 됩니다.
  6. 대규모 데이터 처리와 집계: 대규모 데이터에서 집계, 필터링, 정렬, 그룹화, 계산 등의 데이터 처리를 수행할 때 Spring Batch를 사용할 수 있습니다. 예를 들어 대량의 로그 데이터를 집계하여 분석하는 작업을 자동화할 수 있습니다.
  7. 결제 처리: 금융 업무와 결제 처리 시스템에서 Spring Batch를 사용하여 대규모 거래 데이터를 처리하고 결제 작업을 스케줄링하며, 트랜잭션 일관성을 관리할 수 있습니다.

Spring Batch는 일괄 처리 작업의 안정성, 확장성, 및 재시도 메커니즘을 제공하여 대규모 데이터 처리 작업을 안전하게 수행하는 데 도움을 줍니다. 이러한 작업을 수행할 때 Spring Batch를 활용하면 데이터 일관성을 유지하면서 처리 작업을 효율적으로 수행할 수 있습니다.

 

Spring Scheduler 를 사용하는 상황에 대한 예시 By ChatGPT

Spring의 스케줄러(Spring Scheduler)는 주기적 또는 예약된 작업을 실행하는 데 사용됩니다. 다음은 Spring 스케줄러를 사용하는 일부 예시 상황입니다:

  1. 이메일 예약 발송: 사용자가 이메일 예약 발송을 설정하고, 특정 시간에 이메일을 보내는 시스템을 개발할 때 Spring 스케줄러를 사용할 수 있습니다.
  2. 데이터 동기화: 다른 시스템 또는 API와 데이터를 주기적으로 동기화해야 하는 경우 Spring 스케줄러를 사용하여 데이터 동기화 작업을 스케줄링할 수 있습니다.
  3. 캐시 업데이트: 캐시 업데이트 작업을 주기적으로 수행하여 애플리케이션의 성능을 최적화하는 데 Spring 스케줄러를 사용할 수 있습니다.
  4. 일일 백업: 데이터베이스 백업 또는 파일 시스템 백업을 일정한 주기로 자동으로 실행할 때 Spring 스케줄러를 활용할 수 있습니다.
  5. 보고서 생성: 일정한 주기로 보고서를 생성하고 저장하는 작업을 스케줄링할 때 Spring 스케줄러를 사용합니다. 예를 들어, 주간 판매 보고서를 생성하는 스케줄링 작업.
  6. 정기적인 작업 실행: 시스템 유지 보수 작업 또는 정기적인 데이터 정리 작업을 스케줄링할 때 Spring 스케줄러를 활용합니다.
  7. 시스템 감시 및 경고: 시스템 감시 작업을 스케줄링하여 서버 상태를 주기적으로 모니터하고, 장애 발생 시 알림을 보내는 경우에 Spring 스케줄러를 활용할 수 있습니다.
  8. 자동 주문 처리: 전자 상거래 플랫폼에서 주문을 주기적으로 처리하거나 배송을 예약하는 작업을 스케줄링할 때 Spring 스케줄러를 사용합니다.
  9. 데이터 청소 및 유지 관리: 데이터베이스 또는 파일 시스템에서 오래된 데이터를 정기적으로 삭제하거나 아카이빙하는 작업을 스케줄링할 때 Spring 스케줄러를 활용할 수 있습니다.

Spring 스케줄러를 사용하면 시간 또는 주기에 따라 일련의 작업을 자동화할 수 있으며, 이를 통해 애플리케이션의 효율성과 신뢰성을 향상시킬 수 있습니다.

 

그러나 이중화 된 서버로 추가 (중복 실행 방지) 설정이 필요하게 되는데...

'프로그래밍' 카테고리의 다른 글

select2 트러블 슈팅  (2) 2023.11.22
intellij 번역 플러그인 소개  (1) 2023.11.08
GITHUB CLI CLONE 사용 후기  (0) 2023.11.02
SpringBatch 블로그 실습 후기  (1) 2023.10.30
[Spring Batch] youtube 10분 테코톡 정리  (0) 2023.10.21