[Spring] Spring Batch란?

이다혜·2024년 1월 11일
0

Spring

목록 보기
25/27

1. Spring Batch란?

스프링 배치는 대규모 데이터 처리를 위한 오픈 소스 프레임워크이다.
반복적이고 일관된 작업과 대용량의 데이터를 효율적으로 처리하고 관리할 수 있는 기능을 제공한다.
예를 들어, 대용량 엑셀 파일을 읽어와서 데이터를 가공하는 작업 등을 손쉽게 처리할 수 있다.


2. 핵심 개념

✔ Job(작업)

배치 처리의 기본 단위로, 한 번에 실행되는 작업 단위를 의미한다. Job 안에는 여러 개의 Step이 존재할 수 있으며, Job 안에서 어떤 Step이 실행되어야 하는지 정의한다.

✔ Step(단계)

Job을 구성하는 단위로, 특정 작업을 수행하는 논리적인 세부 단계로, Reader, Processor, Writer의 조합으로 이루어진다.

Step은 Chunk 방식과 Tasklet 방식 중 하나로 정의된다.

  • Chunk 방식

    데이터를 일정량씩 묶어서 처리하는 방식이다.
    각 청크는 하나의 트랜잭션 내에서 수행되며, 트랜잭션 단위마다 일정량의 데이터를 읽어와서 처리 후 쓰기를 수행한다.
    대용량 데이터를 처리할 때 효과적이며, 실패 시 롤백이 가능하도록 트랜잭션을 사용한다.

  • Tasklet 방식

    한 번만 실행되거나 간단한 작업을 수행하기 위한 인터페이스이다.
    이를 통해 배치 작업을 더 세밀하게 제어할 수 있다.

✔ Reader

데이터를 읽어오는 역할을 담당한다.

✔ Processor

읽어온 데이터를 가공하거나 필터링하는 역할을 담당한다.

✔ Writer

가공된 데이터를 저장하거나 외부 시스템에 전달하는 역할을 담당한다.

✔ JobRepository

배치 작업의 메타데이터를 저장하고 관리하는 곳으로, Job의 실행 상태, 실행 이력 등을 추적한다.

✔ JobLauncher

Job을 실행하는 역할을 수행한다. 외부에서 Job을 시작하고 실행한다.


3. 스프링 배치의 장점

✔ 확장성

대용량 데이터 처리에 최적화되어 있으며, 작업 단위를 독립적으로 실행할 수 있다.

✔ 안정성

트랜잭션 관리, 오류 처리, 재시도 등의 기능을 제공하여 안정적인 배치 처리를 보장한다.

✔ 모니터링과 관리

배치 작업의 진행 상황을 모니터링하고 관리할 수 있는 기능을 제공한다.

✔ 유지보수성

스프링 프레임워크와의 통합을 통해 개발 및 유지보수가 용이하다.


4 .간단한 예제

스프링 배치를 사용하여 "Hello World"를 출력하는 예제이다.

@Slf4j
@Configuration
public class HelloJobConfig {
    @Bean
    public Job helloJob(JobRepository jobRepository, Step helloStep1) {
        return new JobBuilder("helloJob", jobRepository)
                .start(helloStep1) // helloStep1 스텝을 시작 스텝으로 설정
                .build();
    }

    @Bean
    public Step helloStep1(JobRepository jobRepository, Tasklet helloStep1Tasklet1, PlatformTransactionManager platformTransactionManager) {
        return new StepBuilder("helloStep1Tasklet1", jobRepository)
                .tasklet(helloStep1Tasklet1, platformTransactionManager)
                .build();
    }

    @Bean
    public Tasklet helloStep1Tasklet1() {
        return ((contribution, chunkContext) -> {
            log.info("Hello World");
            System.out.println("Hello World");
            return RepeatStatus.FINISHED;
        });
    }
}

0개의 댓글