300===Dev Framework/Spring Batch

Spring Batch 완벽 가이드 - 대용량 데이터 처리의 마법사 🪄

블로글러 2024. 11. 7. 09:28

안녕하세요! 오늘은 대용량 데이터 처리의 강자, Spring Batch에 대해 알아보겠습니다.

Spring Batch가 뭔가요? 🤔

은행 입출금 명세서를 처리하는 것을 상상해보세요:

  • 매일 밤 수백만 건의 거래 내역을 처리
  • 실시간으로는 불가능한 대량의 데이터 처리
  • 실패 시 재시작과 중단점 복구가 필요

Spring Batch는 이런 대용량 배치 처리를 위한 프레임워크입니다!

핵심 개념 💡

1. Job

@Bean
public Job importUserJob(JobBuilderFactory jobs) {
    return jobs.get("importUserJob")
        .start(step1())
        .next(step2())
        .build();
}
  • 배치 처리의 가장 큰 단위
  • 하나의 '업무 수행 단위'를 의미
  • 여러 Step으로 구성

2. Step

@Bean
public Step step1(StepBuilderFactory stepBuilderFactory) {
    return stepBuilderFactory.get("step1")
        .<Person, Person>chunk(10)
        .reader(reader())
        .processor(processor())
        .writer(writer())
        .build();
}
  • Job의 세부 실행 단위
  • 실제 비즈니스 로직을 수행

3. Chunk 기반 처리

읽기(100개) -> 처리(100개) -> 쓰기(100개) -> 커밋
  • 데이터를 일정 덩어리로 나눠서 처리
  • 메모리 부하를 줄이고 성능 최적화
  • 실패 시 해당 Chunk만 롤백

동작 방식 🎯

  1. Reader: 데이터 읽기

    @Bean
    public ItemReader<Person> reader() {
     return new JdbcPagingItemReaderBuilder<Person>()
         .name("personItemReader")
         .dataSource(dataSource)
         .selectClause("SELECT id, name, age")
         .fromClause("FROM person")
         .pageSize(100)
         .build();
    }
  2. Processor: 데이터 가공

    @Bean
    public ItemProcessor<Person, Person> processor() {
     return person -> {
         person.setAge(person.getAge() + 1);
         return person;
     };
    }
  3. Writer: 결과 저장

    @Bean
    public ItemWriter<Person> writer() {
     return new JdbcBatchItemWriterBuilder<Person>()
         .sql("INSERT INTO processed_person (id, name, age) VALUES (:id, :name, :age)")
         .dataSource(dataSource)
         .build();
    }

실전 활용 예시 📱

1. 대량 메일 발송

@Configuration
public class EmailBatchConfig {
    @Bean
    public Job sendMailJob() {
        return jobBuilderFactory.get("sendMailJob")
            .start(sendMailStep())
            .build();
    }

    @Bean
    public Step sendMailStep() {
        return stepBuilderFactory.get("sendMailStep")
            .<UserEmail, UserEmail>chunk(100)
            .reader(emailReader())
            .processor(emailProcessor())
            .writer(emailWriter())
            .build();
    }
}

2. 일일 매출 집계

@Configuration
public class SalesAggregationConfig {
    @Bean
    public Job aggregateSalesJob() {
        return jobBuilderFactory.get("aggregateSalesJob")
            .start(aggregateStep())
            .build();
    }
}

장점 🌟

  1. 안정성

    • 자동 재시작
    • 중단점 복구
    • 트랜잭션 관리
  2. 확장성

    • 병렬 처리 지원
    • 다양한 데이터 포맷 지원
    • 커스텀 구현 용이
  3. 모니터링

    • 상세한 실행 이력
    • 성능 메트릭스
    • 에러 추적

주의사항 ⚠️

  1. 메모리 관리

    • 적절한 Chunk 크기 설정
    • 페이징 처리 활용
  2. 멱등성 보장

    • 같은 Job 반복 실행 시 동일 결과
    • 재시작 시나리오 고려
  3. 성능 최적화

    • 인덱스 활용
    • 병렬 처리 설정
    • 적절한 커밋 주기

References 📚

  1. Spring Batch Official Documentation
    https://docs.spring.io/spring-batch/docs/current/reference/html/

  2. Spring Batch in Action (Manning Publications)
    https://www.manning.com/books/spring-batch-in-action

  3. Baeldung Spring Batch Tutorial
    https://www.baeldung.com/spring-batch

728x90