F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

스프링 배치와 스케줄러의 차이점 및 활용 사례

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



스프링 배치와 스케줄러의 차이점

스프링 배치와 스케줄러는 많은 개발자들이 혼동하는 개념입니다. 이 두 가지는 모두 작업을 자동화하는 데 사용되지만, 그 목적과 사용 방식에서 큰 차이가 있습니다.

스프링 배치는 대량의 데이터를 처리하는 데 최적화된 프레임워크입니다. 주로 데이터베이스에서 데이터를 읽고, 처리하고, 다시 저장하는 작업을 수행합니다. 이러한 작업은 일반적으로 배치 작업이라고 불리며, 주기적으로 실행됩니다.

반면에 스케줄러는 특정 시간에 작업을 실행하는 데 사용됩니다. 예를 들어, 매일 자정에 데이터를 백업하거나, 매주 월요일 아침에 보고서를 생성하는 등의 작업을 자동화할 수 있습니다. 스케줄러는 주로 크론 표현식을 사용하여 작업의 실행 시간을 지정합니다.

왜냐하면 스프링 배치는 데이터 처리에 중점을 두고 있으며, 스케줄러는 시간 기반 작업에 중점을 두고 있기 때문입니다.

이 두 가지를 혼합하여 사용할 수도 있습니다. 예를 들어, 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거할 수 있습니다. 이렇게 하면 두 가지의 장점을 모두 활용할 수 있습니다.



스프링 배치의 주요 구성 요소

스프링 배치는 여러 가지 구성 요소로 이루어져 있습니다. 그 중에서도 가장 중요한 구성 요소는 Job, Step, ItemReader, ItemProcessor, ItemWriter입니다.

Job은 배치 작업의 최상위 개념으로, 여러 개의 Step으로 구성됩니다. 각 Step은 특정 작업을 수행하며, 순차적으로 실행됩니다. 예를 들어, 첫 번째 Step에서 데이터를 읽고, 두 번째 Step에서 데이터를 처리하며, 세 번째 Step에서 데이터를 저장할 수 있습니다.

ItemReader는 데이터를 읽는 역할을 합니다. 주로 데이터베이스, 파일, 큐 등에서 데이터를 읽어옵니다. ItemProcessor는 읽어온 데이터를 처리하는 역할을 합니다. 예를 들어, 데이터를 변환하거나, 필터링할 수 있습니다. ItemWriter는 처리된 데이터를 저장하는 역할을 합니다. 주로 데이터베이스, 파일, 큐 등에 데이터를 저장합니다.

왜냐하면 스프링 배치는 대량의 데이터를 효율적으로 처리하기 위해 이러한 구성 요소들을 제공하기 때문입니다.

다음은 스프링 배치의 구성 요소를 사용하는 예제 코드입니다:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Bean
    public Job job(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        return jobBuilderFactory.get("job")
                .start(step1(stepBuilderFactory))
                .next(step2(stepBuilderFactory))
                .build();
    }

    @Bean
    public Step step1(StepBuilderFactory stepBuilderFactory) {
        return stepBuilderFactory.get("step1")
                .chunk(10)
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .build();
    }

    @Bean
    public Step step2(StepBuilderFactory stepBuilderFactory) {
        return stepBuilderFactory.get("step2")
                .chunk(10)
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .build();
    }

    @Bean
    public ItemReader itemReader() {
        return new FlatFileItemReaderBuilder()
                .name("itemReader")
                .resource(new ClassPathResource("data.csv"))
                .delimited()
                .names(new String[]{"field1", "field2"})
                .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                    setTargetType(String.class);
                }})
                .build();
    }

    @Bean
    public ItemProcessor itemProcessor() {
        return item -> item.toUpperCase();
    }

    @Bean
    public ItemWriter itemWriter() {
        return items -> items.forEach(System.out::println);
    }
}


스케줄러의 주요 구성 요소

스케줄러는 주로 크론 표현식을 사용하여 작업의 실행 시간을 지정합니다. 크론 표현식은 초, 분, 시, 일, 월, 요일을 지정하여 작업의 실행 시간을 설정할 수 있습니다.

스프링에서는 @Scheduled 어노테이션을 사용하여 스케줄러를 설정할 수 있습니다. @Scheduled 어노테이션은 메소드에 적용되며, 해당 메소드는 지정된 시간에 실행됩니다.

예를 들어, 매일 자정에 데이터를 백업하는 작업을 설정하려면 다음과 같이 @Scheduled 어노테이션을 사용할 수 있습니다:

@Component
public class ScheduledTasks {

    @Scheduled(cron = "0 0 0 * * ?")
    public void backupData() {
        // 데이터 백업 로직
    }
}

왜냐하면 스케줄러는 시간 기반 작업을 자동화하는 데 최적화되어 있기 때문입니다.

스케줄러는 주로 단순한 작업을 자동화하는 데 사용됩니다. 예를 들어, 매일 특정 시간에 데이터를 백업하거나, 매주 특정 시간에 보고서를 생성하는 등의 작업을 자동화할 수 있습니다.

스케줄러는 스프링 배치와 함께 사용될 수도 있습니다. 예를 들어, 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거할 수 있습니다. 이렇게 하면 두 가지의 장점을 모두 활용할 수 있습니다.



스프링 배치와 스케줄러의 통합

스프링 배치와 스케줄러를 통합하여 사용할 수 있습니다. 예를 들어, 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거할 수 있습니다. 이렇게 하면 두 가지의 장점을 모두 활용할 수 있습니다.

스프링 배치와 스케줄러를 통합하려면 @Scheduled 어노테이션을 사용하여 스프링 배치 작업을 트리거할 수 있습니다. 예를 들어, 매일 자정에 스프링 배치 작업을 실행하려면 다음과 같이 설정할 수 있습니다:

@Component
public class BatchScheduler {

    private final JobLauncher jobLauncher;
    private final Job job;

    public BatchScheduler(JobLauncher jobLauncher, Job job) {
        this.jobLauncher = jobLauncher;
        this.job = job;
    }

    @Scheduled(cron = "0 0 0 * * ?")
    public void runBatchJob() throws Exception {
        JobParameters jobParameters = new JobParametersBuilder()
                .addLong("time", System.currentTimeMillis())
                .toJobParameters();
        jobLauncher.run(job, jobParameters);
    }
}

왜냐하면 스프링 배치와 스케줄러를 통합하면 두 가지의 장점을 모두 활용할 수 있기 때문입니다.

이렇게 하면 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거할 수 있습니다. 예를 들어, 매일 자정에 데이터를 백업하거나, 매주 월요일 아침에 보고서를 생성하는 등의 작업을 자동화할 수 있습니다.

스프링 배치와 스케줄러를 통합하여 사용할 때는 주의할 점이 있습니다. 스프링 배치 작업이 오래 걸리는 경우, 스케줄러가 중복 실행될 수 있습니다. 이를 방지하기 위해서는 스프링 배치 작업이 완료될 때까지 스케줄러를 일시 중지하거나, 스프링 배치 작업이 완료된 후에 스케줄러를 다시 시작하는 등의 방법을 사용할 수 있습니다.



스프링 배치와 스케줄러의 실제 사례

스프링 배치와 스케줄러를 실제 프로젝트에서 어떻게 활용할 수 있는지에 대한 사례를 살펴보겠습니다. 예를 들어, 대량의 이미지를 주기적으로 삭제하는 작업을 스프링 배치와 스케줄러를 사용하여 자동화할 수 있습니다.

먼저, 스프링 배치를 사용하여 대량의 이미지를 삭제하는 작업을 설정합니다. 이를 위해 Job, Step, ItemReader, ItemProcessor, ItemWriter를 설정합니다. ItemReader는 삭제할 이미지의 URL을 데이터베이스에서 읽어오고, ItemProcessor는 읽어온 URL을 처리하며, ItemWriter는 처리된 URL을 사용하여 이미지를 삭제합니다.

다음은 스프링 배치를 사용하여 대량의 이미지를 삭제하는 예제 코드입니다:

@Configuration
@EnableBatchProcessing
public class ImageDeletionBatchConfiguration {

    @Bean
    public Job imageDeletionJob(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        return jobBuilderFactory.get("imageDeletionJob")
                .start(imageDeletionStep(stepBuilderFactory))
                .build();
    }

    @Bean
    public Step imageDeletionStep(StepBuilderFactory stepBuilderFactory) {
        return stepBuilderFactory.get("imageDeletionStep")
                .chunk(10)
                .reader(imageUrlReader())
                .processor(imageUrlProcessor())
                .writer(imageDeletionWriter())
                .build();
    }

    @Bean
    public ItemReader imageUrlReader() {
        return new JdbcCursorItemReaderBuilder()
                .name("imageUrlReader")
                .sql("SELECT url FROM images_to_delete")
                .rowMapper((rs, rowNum) -> rs.getString("url"))
                .build();
    }

    @Bean
    public ItemProcessor imageUrlProcessor() {
        return url -> url;
    }

    @Bean
    public ItemWriter imageDeletionWriter() {
        return urls -> {
            for (String url : urls) {
                // 이미지 삭제 로직
            }
        };
    }
}

왜냐하면 스프링 배치는 대량의 데이터를 효율적으로 처리할 수 있기 때문입니다.

다음으로, 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거합니다. 이를 위해 @Scheduled 어노테이션을 사용하여 스프링 배치 작업을 트리거하는 메소드를 설정합니다.

다음은 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거하는 예제 코드입니다:

@Component
public class ImageDeletionScheduler {

    private final JobLauncher jobLauncher;
    private final Job imageDeletionJob;

    public ImageDeletionScheduler(JobLauncher jobLauncher, Job imageDeletionJob) {
        this.jobLauncher = jobLauncher;
        this.imageDeletionJob = imageDeletionJob;
    }

    @Scheduled(cron = "0 0 0 * * ?")
    public void runImageDeletionJob() throws Exception {
        JobParameters jobParameters = new JobParametersBuilder()
                .addLong("time", System.currentTimeMillis())
                .toJobParameters();
        jobLauncher.run(imageDeletionJob, jobParameters);
    }
}

왜냐하면 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거할 수 있기 때문입니다.

이렇게 하면 스케줄러를 사용하여 특정 시간에 대량의 이미지를 자동으로 삭제할 수 있습니다. 예를 들어, 매일 자정에 이미지를 삭제하거나, 매주 월요일 아침에 이미지를 삭제하는 등의 작업을 자동화할 수 있습니다.



결론

스프링 배치와 스케줄러는 각각의 장점이 있으며, 이를 적절히 활용하면 다양한 작업을 자동화할 수 있습니다. 스프링 배치는 대량의 데이터를 효율적으로 처리하는 데 최적화되어 있으며, 스케줄러는 시간 기반 작업을 자동화하는 데 최적화되어 있습니다.

스프링 배치와 스케줄러를 통합하여 사용할 수도 있습니다. 예를 들어, 스케줄러를 사용하여 특정 시간에 스프링 배치 작업을 트리거할 수 있습니다. 이렇게 하면 두 가지의 장점을 모두 활용할 수 있습니다.

왜냐하면 스프링 배치와 스케줄러를 통합하면 대량의 데이터를 효율적으로 처리하면서도 시간 기반 작업을 자동화할 수 있기 때문입니다.

스프링 배치와 스케줄러를 실제 프로젝트에서 활용할 때는 주의할 점이 있습니다. 스프링 배치 작업이 오래 걸리는 경우, 스케줄러가 중복 실행될 수 있습니다. 이를 방지하기 위해서는 스프링 배치 작업이 완료될 때까지 스케줄러를 일시 중지하거나, 스프링 배치 작업이 완료된 후에 스케줄러를 다시 시작하는 등의 방법을 사용할 수 있습니다.

스프링 배치와 스케줄러를 적절히 활용하면 다양한 작업을 자동화할 수 있으며, 이를 통해 개발 생산성을 크게 향상시킬 수 있습니다.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
logo
copyright © F-Lab & Company 2025