배움/JAVA

SpringBoot Batch 개발 샘플

spaces25 2025. 6. 25. 13:54
반응형

Spring Batch를 사용하여 CSV 파일을 읽고, 데이터를 처리한 다음, 데이터베이스에 저장하는 기본적인 구조입니다.


✅ 기술 스택

  • Spring Boot
  • Spring Batch
  • H2 (In-Memory DB)
  • CSV 파일 Reader
  • Maven

📁 프로젝트 구조

 
spring-batch-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example.batch/
│   │   │       ├── SpringBatchDemoApplication.java
│   │   │       ├── config/BatchConfig.java
│   │   │       ├── model/Person.java
│   │   │       ├── processor/PersonItemProcessor.java
│   │   │       └── writer/ConsoleItemWriter.java
│   │   └── resources/
│   │       ├── application.yml
│   │       └── sample-data.csv

1. Person 모델 클래스

package com.example.batch.model;

public class Person {
    private String firstName;
    private String lastName;

    // getters, setters, toString
}

2. PersonItemProcessor - 데이터 가공

package com.example.batch.processor;

import com.example.batch.model.Person;
import org.springframework.batch.item.ItemProcessor;

public class PersonItemProcessor implements ItemProcessor<Person, Person> {
    @Override
    public Person process(Person person) {
        person.setFirstName(person.getFirstName().toUpperCase());
        person.setLastName(person.getLastName().toUpperCase());
        return person;
    }
}

3. ConsoleItemWriter - 결과 출력

package com.example.batch.writer;

import com.example.batch.model.Person;
import org.springframework.batch.item.ItemWriter;

import java.util.List;

public class ConsoleItemWriter implements ItemWriter<Person> {
    @Override
    public void write(List<? extends Person> items) {
        items.forEach(System.out::println);
    }
}

4. BatchConfig 설정

package com.example.batch.config;

import com.example.batch.model.Person;
import com.example.batch.processor.PersonItemProcessor;
import com.example.batch.writer.ConsoleItemWriter;
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.*;
import org.springframework.batch.item.file.*;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.mapping.*;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.context.annotation.*;
import org.springframework.core.io.ClassPathResource;

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new ClassPathResource("sample-data.csv"))
            .delimited()
            .names("firstName", "lastName")
            .fieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
                setTargetType(Person.class);
            }})
            .build();
    }

    @Bean
    public PersonItemProcessor processor() {
        return new PersonItemProcessor();
    }

    @Bean
    public ConsoleItemWriter writer() {
        return new ConsoleItemWriter();
    }

    @Bean
    public Job importUserJob(JobBuilderFactory jobBuilders, Step step1) {
        return jobBuilders.get("importUserJob")
            .start(step1)
            .build();
    }

    @Bean
    public Step step1(StepBuilderFactory stepBuilders) {
        return stepBuilders.get("step1")
            .<Person, Person>chunk(5)
            .reader(reader())
            .processor(processor())
            .writer(writer())
            .build();
    }
}

5. application.yml

spring:
  batch:
    job:
      enabled: true
    initialize-schema: always

6. sample-data.csv

 
John,Doe
Jane,Smith

7. 메인 클래스

package com.example.batch;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBatchDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBatchDemoApplication.class, args);
    }
}

▶ 실행 결과

Person{firstName='JOHN', lastName='DOE'}
Person{firstName='JANE', lastName='SMITH'}

 

반응형