배움/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'}
반응형