상세 컨텐츠

본문 제목

Spring Batch를 공부하고 스터디에 적용해보자

카테고리 없음

by choiDev 2025. 3. 16. 11:43

본문

목적

Spring Batch이해도를 높이고 실무에서 사용 가능할정도로 스터디

 

Spring Batch 개요

Spring Batch는 대량의 데이터를 효율적으로 처리하기 위한 배치 애플리케이션을 개발할 수 있도록 지원하는 Spring 기반 프레임워크입니다. 주기적으로 실행되는 대규모 데이터 처리[ETL(Extract, Transform, Load) , 데이터 마이그레이션, 정산, 리포트 생성]에 적합합니다.

 

더보기
더보기

ETL(Extract, Transform, Load) 이란? 

  • 추출, 변환, 불러오기의 약자로 데이터를 통합하는 프로세스를 의미함
  • 여러 시스템의 데이터를 단일 데이터 베이스에 결합하는 작업
  • 원시 데이터를 정리 및 구성하여 스토리지, 데이터 분석, ML용으로 준비하는 작업

 


Spring Batch의 주요 특징 정리

  1. 대량의 데이터 처리 지원
    1. 배치서버는 유저와의 상호작용보단 데이터 처리를 위해 사용하므로 대량의 데이터를 빠르게 처리 가능합니다.
  2. Chunk 기반 처리
    1. 데이터를 일정 크기로 나누어 읽고, 처리하고, 저장하는 방식을 사용하여 대규모 데이터여도 한번에 호출하여 밀어넣는 방식이 아닌 일정 데이터를 지속적으로 읽어와 처리하는 Chunk기반으로 처리합니다.
  3. 트랜잭션 관리
    1. 단계별(읽기, 처리, 쓰기)로 트랜잭션을 관리하여 데이터 일관성 유지가능
  4. 자동 재시작 및 오류 복구
    1. 실패한 배치를 자동 재시작 가능하여 재시작시 마지막 성공 지점부터 실행 가능
  5. 병렬 처리 및 멀티스레드 지원
    1. JVM기반 언어 자바 코틀린으로 동작하여 병렬 처리 및 멀티 스레드 지원함

 

Spring Batch 아키텍쳐

Spring Batch는 Job-> Step -> Tasklet/Chunk 구조로 이루어져있습니다.

 

  1. Job
    1. 배치 작업의 최상위 단위로 여러개의 Step을 포함합니다. 
    2. JobLauncher 클래스를 통해 실행됩니다.
  2. Step
    1. 하나의 Job을 구성하는 작업단위
      1. Tasklet 기반 Step : 한개의 작업을 수행하는 방식 
      2. Chunk 기반 Step : 데이터를 나누어 읽고, 처리하고, 저장하는 방식
  3. TaskLet
    1. 단순한 단일 작업 수행 시 사용하는 작업단위 (예: 특정 디렉토리 파일 삭제)
    2. execute() 메서드를 오버라이드 하여 구현
  4. Chunk 기반 처리
    1. 대량 데이터를 일정 단위로 읽고 변환하고 저장하는 방식
    2. Reader > Processor > Writer 형태로 동작

 


Spring Batch 동작 과정

  1. Job 실행(JobLauncher 를 통해 Job 실행)
  2. Step실행(Step내에서 Tasklet or Chunk실행)
  3. Reader실행 
  4. Processor실행
  5. Writer실행
  6. Job종료 및 상태 저장

Tasklet의 특징

  1. 단순작업처리
    1. 한번 실행하고 종료되는 단순 배치 작업에 적합합니다.
    2. 예 : 파일 정리, 특정 테이블 초기화, 외부 API 호출
  2. 반복실행가능
    1. 특정 조건을 만족하면 계속 실행하고 종료 조건을 만족하면 완료하는 구조를 가질수 있습니다.
  3. 트랜잭션 지원
    1. Tasklet이 실행될 때 트랜잭션이 적용되며, 실패 시 롤백 가능합니다.
  4. Step 단위로 실행
    1. Step 내부에서 동작하며 하나의 Step에는 하나의 Tasklet만 포함됩니다.

 

Tasklet은 interface로 이루어져있으며 주요 메서드는 execute입니다.

public interface Tasklet {
    RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
}

Parameter
StepContribution contribution:
Step의 실행 결과(예: 업데이트된 카운트 등)를 저장하는 객체
ChunkContext chunkContext: Step의 실행 컨텍스트를 저장하는 객체

Response
RepeatStatus: FINISHED 또는 CONTINUABLE을 반환하여 실행을 끝낼지 계속할지 결정

 

아래는 로그를 찍는 예제입니다. FINISHED를 호출해서 한번 호출하면 바로 종료하도록 되어있습니다.

@Component
public class SimpleTasklet implements Tasklet {
    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        System.out.println("Tasklet 실행 중...");
        return RepeatStatus.FINISHED;  // 한 번 실행 후 종료
    }
}

 

이번엔 CONTINUABLE 예제로 특정 count에 도달하면 반복을 종료하는 예제입니다.

@Component
public class LoopTasklet implements Tasklet {
    private int count = 0;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        System.out.println("반복 실행: " + count);
        count++;

        if (count < 5) {
            return RepeatStatus.CONTINUABLE; // 5번 실행될 때까지 계속 반복
        }

        return RepeatStatus.FINISHED; // 실행 종료
    }
}