[Spring Batch] Job, Step

chrkb1569·2024년 2월 28일
0

Spring

목록 보기
9/11

지난 시간에는 간략하게 Spring Batch가 무엇인지에 대해서 간략하게 알아보았습니다.

간단하게 정리하자면, Job을 통해 프로그램이 어떻게 동작할지 설정할 수 있는 프레임워크라고 정리할 수 있었습니다.

그런데 Job이 정확히 무엇을 의미할까요?

또 Job과 함께 자주 등장하는 Step은 무엇일까요?

오늘은 이 용어들이 무엇인지 알아보면서, 간단하게 Batch 어플리케이션을 동작시켜보겠습니다.

Job

[Reference : https://docs.spring.io/spring-batch/reference/domain.html#job]

Spring Batch 공식 문서에 명시되어 있는 Job의 정의는 다음과 같습니다.

Spring Batch에서의 Job은 간단하게 Step 인스턴스들의 모음입니다.
Job은 여러 Step 인스턴스들을 조합하여 하나의 작업을 만들고,
재시작 여부와 같은 전역적인 속성들을 설정할 수 있습니다.

설명에서 알 수 있듯이, Spring Batch에서 이루어지는 작업들은 모두 Job이 모여서 수행되는 것이고, 하나의 Job은 여러 Step들로 구성되어져 있습니다.

Step

[Reference : https://docs.spring.io/spring-batch/reference/domain.html#job]

Spring Batch 공식 문서에 명시되어 있는 Step의 정의는 다음과 같습니다.

Step은 배치 작업의 독립적이고 순차적인 단계를 캡슐화하는 도메인 객체입니다.
따라서 모든 Job은 모두 하나 이상의 Step으로 구성됩니다.
Step은 실제 배치 처리를 정의하고 제어하는 데 필요한 모든 정보가 포함됩니다.

Step은 Job을 구성하고 있는 객체를 의미하며, Job을 어떻게 구성하고 실행할 것인지에 대한 정보가 명시되어있습니다.

그런데 Step을 구현하는 방식은 크게 2가지로 나눌 수 있습니다.

1) Tasklet을 통한 구현
2) Chunk 기반 구현

Tasklet을 통한 구현의 경우, 배치 작업이 Tasklet을 통해 이루어진다는 특징을 가지고 있으며, 배치 처리 작업이 쉬운 경우 사용되는 방식이라고합니다.
그러나, 대용량 데이터를 처리하는 경우, 더 복잡해질 수 있다는 단점이 존재합니다.

[Reference : https://docs.spring.io/spring-batch/reference/domain.html]

반대로 Chunk 기반 구현은 다음 그림에서 볼 수 있듯이 ItemReader, ItemProcessor, ItemWriter를 통해서 Step을 구현하는 방식입니다.
대용량 처리를 수행하는 경우, Tasklet보다 효과적이지만, 아무래도 구현해야하는 대상이 많기 때문에 단순 작업에는 효율적이지 못하다는 단점이 존재합니다.

Job, Step 정리

따라서, Job과 Step을 간단하게 그림으로 정리하면 다음처럼 정리할 수 있을 것 같습니다.

Spring Batch 실행해보기

그럼 간단하게 Spring Batch 애플리케이션을 실행해보겠습니다.

Spring Batch 버전이 5로 변경되면서, 많은 분들이 사용하시던 StepBuilderFactory, JobBuilderFactory는 이제 지원하지 않기 때문에, 해당 클래스들은 사용하지 않았습니다.

또한, 간단하게 출력만 확인하는 애플리케이션을 만들 예정이기에, Step은 Tasklet을 통해 구현하겠습니다.

Main 클래스

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

}

먼저, Main 클래스입니다.
이전 Batch 버전에서는 @EnableBatchProcessing 어노테이션을 통해 배치 기능을 활성화했지만, 버전 5부터는 사용하지 않도록 변경되었습니다.

Job, Step, Tasklet

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

@Configuration
@RequiredArgsConstructor
public class BatchConfiguration {
    @Bean
    public Job helloJob(JobRepository jobRepository, Step helloStep) {
        return new JobBuilder("helloJob", jobRepository)
                .start(helloStep)
                .build();
    }

    @Bean
    public Step helloStep(JobRepository jobRepository, Tasklet helloTasklet, PlatformTransactionManager transactionManager) {
        return new StepBuilder("helloStep", jobRepository)
                .tasklet(helloTasklet, transactionManager)
                .build();
    }

    @Bean
    public Tasklet helloTasklet() {
        return (contribution, chunkContext) -> {
            System.out.println("Hello! This is Spring Batch Practice!!");
            return RepeatStatus.FINISHED;
        };
    }
}

이전 버전에서는 @RequiredArgsConstructor 어노테이션을 통해 StepBuilderFactory, JobBuilderFactory를 사용하였으나, JobRepository와 JobBuilder, StepBuilder를 사용하도록 변경되었습니다.

출력 화면

오늘은 간단하게 Job과 Step이 무엇인지에 대해서 알아보았는데요, 공부하며 기록하는 글이라 부정확한 부분이 있을 수 있습니다.

이러한 부분이 있을 경우, 거리낌 없이 말씀해 주시면 감사드리겠습니다!

0개의 댓글