Spring Batch

Kkd·2025년 2월 1일
0

매일메일 개념정리

목록 보기
77/93

Spring Batch란?

Spring Batch대량의 데이터를 효율적으로 처리하는 배치(일괄) 처리 프레임워크입니다.
스프링 기반 애플리케이션에서 대량 데이터 처리, 반복 작업 자동화, 트랜잭션 관리 등을 쉽게 구현할 수 있도록 지원합니다.


1. Spring Batch의 특징 🚀

대량 데이터 처리 → 대용량 파일, 데이터베이스 작업 등을 효율적으로 처리
일괄 처리(Batch Processing) → 특정 시간대에 정해진 작업을 수행
트랜잭션 관리 → 처리 단위(Chunk)별로 트랜잭션 적용 가능
재시도(Retry) & 오류 처리(Skip) → 실패한 작업을 재시도하거나 건너뛸 수 있음
병렬 & 분산 처리 지원 → 성능 최적화 가능


2. Spring Batch 주요 개념

Spring Batch는 Job(작업) → Step(단계) → Tasklet/Chunk(처리 단위) 로 구성됩니다.

📌 2.1. Spring Batch 구성 요소

구성 요소설명
Job하나 이상의 Step으로 이루어진 배치 작업 단위
Step실제로 실행되는 개별 작업 (ItemReader, ItemProcessor, ItemWriter 포함)
JobLauncherJob을 실행하는 역할
JobRepositoryJob 실행 정보를 저장하고 관리 (DB 기반)
Tasklet간단한 작업을 수행하는 Step 방식
Chunk데이터를 여러 개의 작은 단위(Chunk)로 나누어 처리하는 방식
ItemReader데이터를 읽어오는 역할 (DB, 파일, API 등)
ItemProcessor데이터를 가공 및 변환하는 역할
ItemWriter데이터를 저장(쓰기)하는 역할 (DB, 파일, 메시지 큐 등)

3. Spring Batch 동작 방식 🔄

1️⃣ Job 실행 →
2️⃣ Step 실행 (Tasklet or Chunk 방식) →
3️⃣ ItemReader가 데이터 읽기 →
4️⃣ ItemProcessor가 데이터 가공 →
5️⃣ ItemWriter가 데이터 저장
6️⃣ Job 완료

📌 Chunk 기반 처리 흐름

Step 실행 → Chunk 단위로 데이터 읽기 → 처리 → 저장 → 반복 → 완료

예를 들어 1000개의 데이터를 처리할 때 Chunk 크기를 100으로 설정하면:

  • 100개씩 읽고 → 처리 → 저장 → 반복하여 10번 수행 후 작업 완료

4. Spring Batch 기본 예제 🛠

4.1. 의존성 추가 (Maven & Gradle)

Maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

Gradle

implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'

4.2. 기본 배치 작업 (Job & Step 정의)

@Configuration
@EnableBatchProcessing  // Spring Batch 활성화
public class BatchConfig {
    
    @Bean
    public Job myJob(JobBuilderFactory jobBuilderFactory, Step myStep) {
        return jobBuilderFactory.get("myJob")
                .start(myStep) // Step 실행
                .build();
    }

    @Bean
    public Step myStep(StepBuilderFactory stepBuilderFactory) {
        return stepBuilderFactory.get("myStep")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("Spring Batch 실행 완료!");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}

@EnableBatchProcessing → Spring Batch 활성화
Job → 하나 이상의 Step 실행
StepTasklet을 사용하여 간단한 작업 수행

📌 실행하면 콘솔 출력:

Spring Batch 실행 완료!

4.3. Chunk 기반 배치 (데이터 읽기 → 처리 → 저장)

아래 예제는 CSV 파일을 읽고 → 대문자로 변환 → 데이터베이스에 저장하는 배치 프로그램입니다.

1️⃣ ItemReader (CSV 데이터 읽기)

@Bean
public FlatFileItemReader<String> reader() {
    return new FlatFileItemReaderBuilder<String>()
            .name("csvReader")
            .resource(new ClassPathResource("data.csv"))
            .lineMapper(new DefaultLineMapper<>())
            .build();
}

2️⃣ ItemProcessor (데이터 변환)

@Bean
public ItemProcessor<String, String> processor() {
    return item -> item.toUpperCase(); // 데이터를 대문자로 변환
}

3️⃣ ItemWriter (DB 저장)

@Bean
public JdbcBatchItemWriter<String> writer(DataSource dataSource) {
    return new JdbcBatchItemWriterBuilder<String>()
            .dataSource(dataSource)
            .sql("INSERT INTO users (name) VALUES (:name)")
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .build();
}

4️⃣ Job & Step 설정

@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory, 
                   ItemReader<String> reader, 
                   ItemProcessor<String, String> processor, 
                   ItemWriter<String> writer) {
    return stepBuilderFactory.get("myStep")
            .<String, String>chunk(10) // Chunk 크기 설정
            .reader(reader)
            .processor(processor)
            .writer(writer)
            .build();
}

Chunk(10) → 10개씩 읽고, 변환 후 저장
ItemReader → CSV 파일 읽기
ItemProcessor → 데이터 변환
ItemWriter → DB 저장


5. Spring Batch 실행 방법

5.1. Java 코드에서 실행

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job myJob;

public void runBatchJob() throws Exception {
    JobParameters jobParameters = new JobParametersBuilder()
            .addLong("time", System.currentTimeMillis()) // 중복 실행 방지
            .toJobParameters();

    jobLauncher.run(myJob, jobParameters);
}

5.2. Command Line에서 실행

$ mvn spring-boot:run

6. Spring Batch 추가 기능

기능설명
재시도(Retry)특정 예외 발생 시 재시도 (RetryPolicy)
건너뛰기(Skip)특정 예외 발생 시 데이터 건너뛰기 (SkipPolicy)
병렬 실행멀티 스레드로 Step 실행 (TaskExecutor)
JobParameter실행 시 동적 파라미터 전달 가능
Step 분할(Partitioning)데이터를 여러 Step으로 분산 처리

7. 정리 🚀

Spring Batch대량 데이터 처리 및 자동화된 배치 작업을 지원
Step 기반 처리Tasklet (단순 작업) 또는 Chunk (대량 데이터 처리) 방식 사용
ItemReader → ItemProcessor → ItemWriter 패턴으로 대량 데이터 처리 가능
트랜잭션, 오류 처리, 재시도 등 다양한 기능 제공
파일 읽기, 데이터 변환, DB 저장, 병렬 처리 등 다양한 시나리오에서 활용


추가 학습 자료

profile
🌱

0개의 댓글