yata project에서 기한이 만료된 게시글을 일정 시간마다 한번에 처리해 줄 필요가 있었고,
spring batch기능을 통해 일괄처리해주기로 결정하였다.

 

🔎스프링 배치(Spring Batch)
대량의 데이터를 처리하기 위한 일괄 처리(Batch Processing) 프레임워크
일괄 처리는 주기적으로 실행되며, 대부분의 작업은 큰 데이터 세트를 읽어 처리하고, 가공하여 결과를 저장하는 작업이다.
스프링 배치는 이러한 일괄 처리 작업을 효율적이고 안정적으로 처리하기 위한 다양한 기능과 구성 요소를 제공한다.
🔎스케줄링(Scheduling)
정해진 일정 또는 주기에 따라 작업을 실행하는 기능
주로 주기적으로 실행되는 반복 작업에 사용된다.
스프링 프레임워크에서는 @Scheduled 애너테이션을 사용하여 메서드에 스케줄링을 설정하며, 주기적으로 해당 메서드가 실행되도록 예약할 수 있다.
주로 백그라운드 작업, 일정한 주기로 데이터를 처리하는 작업, 리소스 관리 등에 활용된다.

 

스프링 배치에 대한 자세한 개념은 아래 포스팅에 정리하였다.

 

Spring batch

대용량 레코드 처리에 필수적인 기능을 제공 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 배치 작

develoyummer.tistory.com

 

 

yata project에서는
스프링 배치를 사용하여 일괄 처리 작업을 정의하고 실행하기 위한 구성 요소들이 YataBatchConfig 클래스에 정의하였고, 간단한 비교적 step을 정의하고 있기 때문에 , 
chunk 방식이 아닌 tasklet 방식을 사용하였다.

동시에 @Scheduled 애너테이션을 사용하여 YataBatchScheduler 클래스에서 스케줄링을 설정하여 일정한 주기로 스프링 배치 작업을 실행하도록 하였다.

 

 

 

 

설정

1. Spring batch Dependency추가

 

 

2. 애플리케이션 메인 클래스에 @EnableBatchProcessing,@EnableScheduling 어노테이션을 설정

 

 

 

 

YataBatchConfig 클래스

@Configuration
@Slf4j
@EnableBatchProcessing
public class YataBatchConfig {
    public final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    private final JpaYataRepository yataRepository;
    private final JpaYataRequestRepository yataRequestRepository;

    public YataBatchConfig(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory, JpaYataRepository yataRepository, JpaYataRequestRepository yataRequestRepository) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
        this.yataRepository = yataRepository;
        this.yataRequestRepository = yataRequestRepository;
    }

    @Bean
    public Job yataJob() {
        return jobBuilderFactory.get("yataJob")
                .start(yataStep()).next(yataRequestStep())
                .build();
    }
@Bean
    public Step yataStep() {
        return stepBuilderFactory.get("yataStep")
                .tasklet((contribution, chunkContext) -> {
                    yataRepository.updateYataOverDepartureTime();
                    return RepeatStatus.FINISHED;
                })
                .build();

    }

    public Step yataRequestStep() {
        return stepBuilderFactory.get("yataRequestStep")
                .tasklet((contribution, chunkContext) -> {
                    yataRequestRepository.updateExpiredYataRequest();
                    return RepeatStatus.FINISHED;
                })
                .build();

    }
}

코드 설명

@Configuration
Spring에 의해 구성 클래스로 인식
@EnableBatchProcessing
Spring Batch를 사용할 수 있도록 활성화

JobBuilderFactory StepBuilderFactory
Spring Batch에서 제공하는 빌더 클래스로,
Job과 Step을 생성하는 데 사용된다.

 

yataJob()
StepBuilderFactory를 사용하여 yataStep을 생성
이 Step은 tasklet 기반으로 구성되어 있으며, yataRepository.updateYataOverDepartureTime() 을 수행하는 작업을 수행

 

 

YataBatchScheduler 클래스

@Component
@Slf4j
public class YataBatchScheduler {
    private final JobLauncher jobLauncher;
    private final YataBatchConfig yataBatchConfig;

    public YataBatchScheduler(JobLauncher jobLauncher, YataBatchConfig yataBatchConfig) {
        this.jobLauncher = jobLauncher;
        this.yataBatchConfig = yataBatchConfig;
    }
    // 10분 마다 실행
    //@Scheduled(cron = "0 0/10 * * * ")
    // 1분 마다 실행
    @Scheduled(fixedDelay = 1000 60 * 20) // 20분 마다 실행 //fixedDelay는 해당 작업이 끝난 시점부터 시간을 세고, fixedRate는 해당 작업의 시작 시점부터 시간을 센다.
    public void runExpiredYataBatch() {
        Map<String, JobParameter> jobParameter = new HashMap<>();
        jobParameter.put("yataJobExpire", new JobParameter(System.currentTimeMillis()));
        JobParameters jobParameters = new JobParameters(jobParameter);
        try {
            jobLauncher.run(yataBatchConfig.yataJob(), jobParameters);
            log.info("YataBatchScheduler runExpiredYataBatch");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("YataBatchScheduler Error :{}", e.getMessage());
        }
    }
}

 

@Component
컴포넌트로 등록


JobLauncher와 YataBatchConfig를 주입받아 사용


runExpiredYataBatch()
@Scheduled 사용하여 스케줄링하며,
현재 설정된
(fixedDelay = 1000 * 60 * 20) 은 20분마다 실행되도록 함

 

작업 실행 시간마다 새로운 JobParameters(yataJobExpire라는 키와 현재 시간을 값으로 갖는 JobParameter 객체가 포함)를 생성하여 파라미터로 전달하고


jobLauncher를 사용하여 yataBatchConfig의 yataJob()을 실행한다.
yataJob()은 Spring Batch에서 정의한 일련의 작업을 포함하는 Job 객체를 반환한다.


jobLauncher.run() 메서드는 이 Job을 실행하고, 앞서 설정한 JobParameters를 전달한다.

배치 작업이 정상적으로 실행되면, "YataBatchScheduler runExpiredYataBatch"라는 로그를 남기고,
만약 예외가 발생한 경우, 해당 예외를 출력하고 에러 메시지를 로그에 남긴다.

 

 

 

 

이제 게시글 마감 처리를 20분마다 한번에 자동으로 할 수 있게 되었다. 

 

 

 

 

 

 

 

 

 

 

'Spring' 카테고리의 다른 글

토스페이 API 연동  (0) 2023.06.09
[프로젝트] 카테시안 곱 문제의 발생과 해결  (0) 2023.06.07
Spring batch  (0) 2023.06.05
ehcache의 속성  (2) 2023.06.02
[프로젝트] 2차 캐시의 적용/ 1차캐시와 2차캐시 차이  (0) 2023.06.01
복사했습니다!