스프링 배치(Spring Batch) 알아보기

2025. 4. 29. 17:11·개발
반응형

 

 


 

프로젝트를 진행하며 대규모 데이터를 일괄 처리해야 할 필요성이 생겼다.

단순히 데이터 각각에 작업을 수행하면 오버헤드가 굉장히 클 것으로 예측된다..

그러므로, 이번 기회에 스프링 배치를 알아보자!

 

스프링 배치 (Spring Batch)

 

배치 (Batch) : 서로 연관된 데이터들을 그룹화하여 일괄 처리하는 방식

스프링 배치 (Spring Batch) : 대용량 데이터에 대한 배치 작업을 수행해주는 스프링 기반 프레임워크

 

스케줄러 (Scheduler) : 주어진 작업을 미리 정의된 시간에 수행해주는 도구

스프링 배치는 이러한 스케줄러와 함께 사용하는 경우가 많다!

 

 


주요 용어

 

  • Job : 배치 처리 과정을 추상화한 개념
    • 하나 이상의 Step을 포함한다.
    • 스프링 배치 계층에서 가장 상위에 위치한다.
  • JobInstance : Job의 실행 단위 인스턴스
    • Job : 매일 5시에 데이터를 처리하기
    • JobInstance : 1/1 인스턴스, 1/2 인스턴스, ...
  • JobParameters : JobInstance를 구별해주는 매개변수
    • String, Double, Long, Date 타입이 존재한다.
  • JobExecution : JobInstance의 실행 시도 단위
    • JobInstance 실행에 대한 상태, 시작 시간, 종료 시간, 생성 시간 등의 세부 정보를 가지고 있다.

 


 

  • Step : 배치 처리 작업이 이루어지는 단위
    • Job의 하위 단계이다.
    • 한 개 이상의 Step으로 Job이 구성된다.
    • 각 Step은 순차적으로 처리된다.
  • StepExecution : Step의 실행 시도 단위
    • Step 실행에 대한 상태, 실행 시간 등의 세부 정보를 가지고 있다.
    • 읽은 아이템의 개수, 쓴 아이템의 개수, 커밋 횟수, 스킵한 아이템의 개수 등도 포함한다.

 


 

  • ExecutionContext : Job, Step 간의 공유 데이터 저장소
    • Job 또는 Step이 실패했을 경우, 마지막 실행 상태를 복구할 수 있게 해준다.
      • JobExecutionContext : Job 커밋 시점의 데이터를 저장한다.
      • StepExecutionContext : 실행 시점의 데이터를 저장한다.
  • JobRepository : 배치 작업에 관련된 모든 정보를 저장하고 관리하는 메커니즘
    • JobExecution, StepExecution, JobParameters 등을 저장하고 관리한다.
    • Job이 실행되면, 새로운 JobExecution과 StepExecution을 생성하고, 실행 상태를 추적한다.
  • JobLauncher : Job과 JobParameters를 받아서 Job을 실행하는 객체
    • Job의 생명 주기를 관리한다.
    • JobRepository를 통해 실행 상태를 유지한다.

 


 

  • ItemReader : 배치 작업에서 처리할 아이템을 읽어오는 인터페이스
    • 데이터베이스, 파일, 메시지 큐 등의 데이터 소스로부터 데이터를 읽어오는 다양한 구현체를 제공한다.
  • ItemProcessor : ItemReader에서 읽어온 아이템을 처리하는 인터페이스
    • 데이터 필터링, 변환 등의 작업을 수행한다.
    • 필요에 따라 사용하지 않을수도 있다.
  • ItemWriter : ItemProcessor에서 처리한 데이터를 최종적으로 기록하는 인터페이스
    • 데이터베이스 저장, 파일 생성, 메시지 발행 등 다양한 방식의 구현체를 제공한다.

 


 

  • Tasklet : 간단한 단일 작업을 수행하기 위해 사용하는 인터페이스
    • ItemReader, ItemProcessor, ItemWriter를 사용하는 Chunk 기반 처리 방식과 다른 방식이다.
    • Step의 모든 처리가 끝날 때까지 execute 메서드를 호출한다.

 


 

  • JobOperator : Job의 실행, 중지, 재시작 등의 배치 작업 흐름 제어를 담당하는 외부 인터페이스
    • JobLauncher, JobRepository에 대한 접근 없이도 배치 작업을 수행하거나 상태를 조회할 수 있게 해준다.
  • JobExplorer : Job의 실행 이력을 조회하는 데 사용된다.
    • Job의 실행 중 정보를 관리하는 JobReposiroty와 다르게, 읽기 전용 접근에 초점을 맞춘다.

 


메타 테이블

 

스프링 배치는 배치 작업의 상태를 관리하기 위한 메타 데이터를 저장하는 6개의 테이블을 자동으로 생성한다.

또한, 배치 작업을 수행하면 자동으로 값이 대입된다.

  • BATCH_JOB_INSTANCE : JobInstance 정보를 유지한다.
  • BATCH_JOB_EXECUTION : JobExecution 정보를 유지한다.
  • BATCH_JOB_EXECUTION_PARAMS : JobParameters 정보를 유지한다.
  • BATCH_JOB_EXECUTION_CONTEXT : 각각의 JobExecution마다의 작업 실행 컨텍스트 정보를 유지한다.
  • BATCH_STEP_EXECUTION : StepExecution 정보를 유지한다.
  • BATCH_STEP_EXECUTION_CONTEXT : 각각의 StepExecution마다의 작업 실행 컨텍스트 정보를 유지한다.

 


사용 예시

 

implementation 'org.springframework.boot:spring-boot-starter-batch'
testImplementation 'org.springframework.batch:spring-batch-test'

 

먼저 build.gradle 파일에 의존성을 추가해야 한다.

 

spring:
  batch:
    job:
      enabled: false

 

또한, application.yml 파일에 위 내용을 추가하지 않으면, 프로젝트를 실행할 때 모든 배치 작업이 실행된다.

그러므로, 특정 시점에만 배치 작업이 수행되길 원한다면 위 내용을 추가하도록 하자~!

 

@Configuration
@EnableBatchProcessing
@RequiredArgsConstructor
public class MultiStepJobConfig
{
    private final JobRepository jobRepository;
    private final PlatformTransactionManager transactionManager;

    @Bean
    public Job exampleJob() {
        return new JobBuilder("exampleJob", jobRepository)
                .start(step1())
                .next(step2())
                .next(step3())
                .build();
    }

    @Bean
    public Step step1() {
        return new StepBuilder("step1", jobRepository)
                .tasklet((contribution, chunkContext) -> {
                    // 첫번째 작업
                    return RepeatStatus.FINISHED;
                }, transactionManager)
                .build();
    }

    @Bean
    public Step step2() {
        return new StepBuilder("step2", jobRepository)
                .tasklet((contribution, chunkContext) -> {
                    // 두번째 작업
                    return RepeatStatus.FINISHED;
                }, transactionManager)
                .build();
    }

    @Bean
    public Step step3() {
        return new StepBuilder("step3", jobRepository)
                .tasklet((contribution, chunkContext) -> {
                    // 세번째 작업
                    return RepeatStatus.FINISHED;
                }, transactionManager)
                .build();
    }
}

 

Job과 그 안의 Step들은 위와 같이 정의할 수 있다!

각각의 Step들은 설정대로 순차적으로 실행된다.

 

Job 내부에서 Step의 ExitStatus에 따라 분기 처리를 할 수도 있다.

이렇듯, 스프링 배치는 배치 작업을 편리하게 작성하게 해준다!

 

 

Step은 Tasklet 방식 또는 Chunk 방식으로 구현할 수 있다.

위의 예제 코드는 Tasklet 방식으로 Step을 정의한 것이다.

 

 

그러나, 복잡하거나 대량의 데이터 처리를 요구하는 경우에는 Chunk 방식이 더 적합하다!

왜냐하면, Chunk 방식은 큰 데이터를 일련의 작은 데이터 묶음으로 나누고, 각 Chunk를 개별적인 트랜잭션 범위 내에서 처리하기 때문이다.

따라서, 전체 데이터를 한 번에 메모리에 올리지 않아도 되며, 일부 Chunk가 실패해도 나머지에는 영향이 없으므로 대용량 데이터 처리에 적합하다!

 


장점

 

  • Chunk 방식을 통해 대용량 데이터를 나눠서 처리할 수 있다.
  • Job-Step 구조를 통해 복잡한 작업을 단계별로 쪼갤 수 있다.
  • 대량의 데이터 입출력에 특화된 컴포넌트를 ItemReader, ItemProcessor, ItemWriter로 추상화해준다.
  • 각각의 Chunk는 개별적인 트랜잭션을 사용함으로써 서로 독립적으로 작업된다.
  • 메타 테이블을 통해 실행 상태를 자동으로 기록해준다.
  • 멀티 스레드 및 파티셔닝을 통한 병렬 처리가 가능하다.

 


 

 

(참고)

https://dkswnkk.tistory.com/707

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'개발' 카테고리의 다른 글

무중단 배포 전략  (0) 2025.05.13
[ NAVER D2 ] NELO Alaska: 대용량 로그 데이터 저장을 위한 Apache Iceberg 도입기  (0) 2025.05.12
[Challenge.with] 엔티티를 어떻게 정의할까?  (0) 2025.04.26
디자인 패턴 총정리  (0) 2025.04.16
스프링 총정리  (0) 2025.04.15
'개발' 카테고리의 다른 글
  • 무중단 배포 전략
  • [ NAVER D2 ] NELO Alaska: 대용량 로그 데이터 저장을 위한 Apache Iceberg 도입기
  • [Challenge.with] 엔티티를 어떻게 정의할까?
  • 디자인 패턴 총정리
sleepzzz214
sleepzzz214
아! 응애에요~!
  • sleepzzz214
    응애 개발자의 일지
    sleepzzz214
  • 전체
    오늘
    어제
    • ⭐ (51)
      • 개발 (51)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    state
    의존 관계 주입
    프로토타입
    데이터베이스
    구조 패턴
    스프링부트
    Spring
    싱글톤
    Solid
    객체 지향 프로그래밍
    자바
    @Autowired
    스프링 빈
    의존성 주입
    java
    스프링
    생성 패턴
    상태 패턴
    스프링 핵심 원리 - 기본편
    DB
    singleton
    행동 패턴
    싱글톤 패턴
    Kafka
    제어의 역전
    상태
    DI
    디자인 패턴
    객체 지향 설계
    김영한 스프링 강의
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sleepzzz214
스프링 배치(Spring Batch) 알아보기
상단으로

티스토리툴바