Framework/Spring

[Batch] 배치 애플리케이션의 이해와 Spring Batch 기본 활용법

Joonfluence 2024. 11. 24. 22:59

1. 배치의 정의

배치(Batch)는 대량의 데이터를 정기적이고 반복적으로 처리하는 프로그램입니다. 주로 사용자가 없는 새벽 시간대에 실행되며, 대규모 데이터의 처리, 집계, 변환 등 비즈니스 로직을 실행하는 데 활용됩니다. 


2. 배치 애플리케이션이 필요한 이유

2.1 WAS와 배치의 구분
  • WAS (Web Application Server)는 사용자 요청을 실시간으로 처리하는 서버입니다.
  • 하지만 배치와 같이 대규모 데이터를 처리하거나 비즈니스 로직을 길게 실행해야 하는 작업은 WAS에서 실행하기 적합하지 않습니다.
    주요 이유는 다음과 같습니다:
    • 성능 문제: 실시간 요청을 처리하는 서버에서 대량 데이터 작업을 수행하면, 응답 속도가 느려져 사용자 경험이 저하됩니다.
    • 안정성 문제: 장시간 실행되는 작업은 서버 부하를 유발하거나 실패 시 서비스 장애로 이어질 수 있습니다.
    • 스케줄링 필요: 배치는 정해진 시간에 주기적으로 실행되므로 스케줄링이 필요합니다.
2.2 배치가 필요한 시나리오
  • 커머스 사이트의 매출 집계: 하루 50만~100만 건의 거래 데이터를 실시간으로 조회하려면 서버 부하가 큽니다. 대신, 새벽에 전날 데이터를 집계해 미리 저장해두고 요청 시 바로 제공하면 성능을 최적화할 수 있습니다.
  • ERP 데이터 전송: 사내 데이터와 외부 시스템 간 연동 작업을 일정 주기로 처리 할 때, 사용하기도 합니다.

 

3. Spring Batch와 다른 스케줄링 기술의 차이점


기술 Spring Batch Spring Scheduler Spring Quartz
주요 목적 대규모 데이터 처리 및 워크플로 관리 단순한 반복 작업 관리 고급 스케줄링 및 작업 의존성 관리
구성 요소 Job, Step, Reader, Processor, Writer @Scheduled 어노테이션 Job, Trigger
상태 관리 지원 (Job Execution 상태 기록) 미지원 지원 (Persistent Job Store 활용 시)
분산 처리 기본 지원 미지원 클러스터링 지원
적용 사례 대규모 배치 작업, 데이터 처리 파이프라인 간단한 반복 작업 복잡한 스케줄링, 분산 환경 작업

 

4. Spring Batch의 구성 요소

Spring Batch는 데이터를 읽고, 처리하고, 저장하는 작업을 단계적으로 수행합니다.

  • Tasklet: 단일 작업을 실행하는 로직
  • ItemReader: 데이터를 읽어오는 역할 (e.g., 데이터베이스, 파일)
  • ItemProcessor: 읽어온 데이터를 가공, 변환
  • ItemWriter: 처리된 데이터를 저장 (e.g., 데이터베이스, 파일)
  • Job: 여러 개의 Step을 포함하며 배치의 최상위 개념
  • Step: Tasklet 또는 Reader-Processor-Writer로 구성된 단위 작업

 

5. Spring Batch의 메타 테이블

Spring Batch는 실행 상태와 결과를 메타 테이블에 저장해 관리합니다.
이 메타 테이블들은 자동으로 생성되며 작업의 상태 추적 및 재시도를 가능하게 합니다.

  • BATCH_JOB_INSTANCE: Job의 인스턴스 정보
  • BATCH_JOB_EXECUTION: 실행된 Job의 시작 및 종료 시간, 상태 정보
  • BATCH_STEP_EXECUTION: Step의 실행 정보

 

6. Spring Batch와 스케줄링 기술의 결합

Spring Batch는 배치를 정의하는 데 사용되며, Spring Scheduler 또는 Spring Quartz와 결합해 정해진 시간에 배치를 실행할 수 있습니다.

예시 코드: Spring Batch + Spring Scheduler
 
@Component
public class SchedulerConfig {
    @Scheduled(cron = "0 0 1 * * ?") // 매일 새벽 1시 실행
    public void runBatchJob() {
        JobParameters jobParameters = new JobParametersBuilder()
                .addLong("time", System.currentTimeMillis())
                .toJobParameters();
        try {
            jobLauncher.run(batchJob, jobParameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
 
 
예시 코드: Spring Batch + Spring Quartz
 
@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail batchJobDetail() {
        return JobBuilder.newJob(QuartzBatchLauncher.class)
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger batchJobTrigger() {
        return TriggerBuilder.newTrigger()
                .forJob(batchJobDetail())
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 1 * * ?"))
                .build();
    }
}

@Component
public class QuartzBatchLauncher implements Job {
    @Autowired
    private JobLauncher jobLauncher;
    @Autowired
    private Job batchJob;

    @Override
    public void execute(JobExecutionContext context) {
        JobParameters jobParameters = new JobParametersBuilder()
                .addLong("time", System.currentTimeMillis())
                .toJobParameters();
        try {
            jobLauncher.run(batchJob, jobParameters);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

7. Batch 실행 흐름 컨트롤: Next, Flow, Decide

Spring Batch는 작업의 흐름을 세밀하게 제어할 수 있습니다.

  • Next: 순차적으로 Step 연결
.start(stepA)
.next(stepB)
.build();
  • Flow: 오류가 발생할 경우 특정 Step으로 분기
.from(stepA).on("FAILED").to(stepC)
.from(stepA).on("*").to(stepB)
  • Decide: 조건에 따라 다양한 분기 처리
.from(stepA).next(decisionStep).on("CONDITION_1").to(stepB)
.from(decisionStep).on("CONDITION_2").to(stepC)

 

결론

Spring Batch는 대규모 데이터를 효율적으로 처리하기 위한 강력한 도구이며, 스케줄링 기술(Spring Scheduler, Quartz)과 결합해 실무에 적합한 배치 시스템을 구축할 수 있습니다. 

반응형