스프링 Spring
15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring
포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. Spring Batch란?
✔ Spring Batch는 대량의 데이터를 효율적으로 처리할 수 있도록 설계된 Spring 기반 배치 프레임워크
✔ 데이터베이스 조회, 파일 처리, 데이터 변환, 대량 트랜잭션 등의 배치 작업을 안정적으로 수행 가능
📌 Spring Batch의 주요 특징
대량 데이터 처리 | 수천만 건 이상의 데이터도 효율적으로 처리 가능 |
트랜잭션 관리 | 배치 작업 중 오류 발생 시 롤백 가능 |
병렬 처리 지원 | 멀티 스레드 및 클러스터링을 활용하여 성능 향상 |
재시작 가능(Checkpointing) | 실패한 작업을 재시작할 수 있도록 지원 |
다양한 데이터 소스 지원 | 데이터베이스, CSV, JSON, XML 파일 등을 활용 가능 |
📌 Spring Batch는 "대량 데이터를 안전하고 효율적으로 처리하기 위한 강력한 프레임워크"
2. 배치 처리가 필요한 이유
✔ 대량 데이터를 한 번에 처리해야 하는 경우
✔ 반복적으로 실행해야 하는 작업이 있을 때 (예: 정산, 로그 분석, 데이터 마이그레이션)
✔ API 요청이 많아 시스템 부담이 커지는 경우, 배치 작업으로 분산 처리 가능
📌 배치 처리가 필요한 대표적인 예제
✔ 야간 데이터 정산 (주문 결제 처리, 사용자 포인트 정리 등)
✔ 정기적으로 실행되는 보고서 생성
✔ 대량의 데이터를 변환하고 이동하는 ETL(Extract, Transform, Load) 작업
📌 Spring Batch를 활용하면 "대규모 데이터를 효율적으로 처리하고, 자동화할 수 있음"
✅ 여기까지 Spring Batch의 개념과 배치 작업이 필요한 이유를 배웠습니다!
👉 "그렇다면, Spring Boot에서 Spring Batch를 어떻게 설정할까?"
✅ 2부에서 Spring Batch 설정 및 기본적인 배치 작업 구현 방법을 배워봅시다!
2. 상세 주제 정리
1. Spring Batch 의존성 추가
✔ Spring Boot 프로젝트에서 Spring Batch를 사용하려면 spring-boot-starter-batch를 추가해야 함
📌 1️⃣ build.gradle 설정
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-batch'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'mysql:mysql-connector-java'
}
✔ Spring Batch, JPA, MySQL 연동을 위한 의존성 추가
2. Spring Batch 기본 설정
✔ Spring Batch는 @EnableBatchProcessing을 사용하여 활성화 가능
📌 BatchConfig 설정
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
}
✔ Spring Boot에서 자동으로 Batch Job을 실행할 수 있도록 설정
📌 Spring Batch는 "자동 실행 설정을 통해 배치 작업을 손쉽게 설정 가능"
3. Step과 Job 정의 – 기본 배치 작업 구현
✔ Spring Batch에서는 Job과 Step을 정의하여 배치 작업을 구성
📌 Spring Batch의 핵심 개념
Job | 하나 이상의 Step으로 구성된 배치 작업의 단위 |
Step | 실제 작업을 수행하는 단위 (읽기, 처리, 저장) |
ItemReader | 데이터를 읽어오는 역할 |
ItemProcessor | 데이터를 가공하는 역할 |
ItemWriter | 데이터를 저장하는 역할 |
📌 Spring Batch에서는 "Step을 조합하여 배치 Job을 구성할 수 있음"
4. 배치 작업 구현 – CSV 파일을 읽어와서 데이터 저장하기
✔ CSV 파일에서 데이터를 읽고, 가공한 후, 데이터베이스에 저장하는 배치 작업을 구현
📌 1️⃣ User 엔티티 생성
import jakarta.persistence.*;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
protected User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getter & Setter
}
✔ JPA를 사용하여 데이터베이스에 저장할 엔티티 생성
📌 2️⃣ UserRepository 생성
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
✔ JPA를 활용하여 데이터를 저장할 Repository 생성
📌 3️⃣ CSV 파일에서 데이터를 읽어오는 Reader 구현
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.separator.LineTokenizer;
import org.springframework.batch.item.file.separator.DelimitedLineTokenizer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
@Component
public class UserItemReader extends FlatFileItemReader<User> {
public UserItemReader() {
setResource(new ClassPathResource("users.csv"));
setLinesToSkip(1);
setLineMapper(new DefaultLineMapper<User>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames("name", "email");
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {{
setTargetType(User.class);
}});
}});
}
}
✔ CSV 파일에서 데이터를 읽고, User 객체로 변환하여 반환
📌 4️⃣ 데이터베이스에 저장하는 Writer 구현
import org.springframework.batch.item.ItemWriter;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@Component
public class UserItemWriter implements ItemWriter<User> {
@Autowired
private UserRepository userRepository;
@Override
public void write(List<? extends User> users) throws Exception {
userRepository.saveAll(users);
}
}
✔ User 데이터를 데이터베이스에 저장하는 Writer 구현
📌 5️⃣ Step과 Job을 정의하여 배치 실행
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.builder.JobBuilder;
import org.springframework.batch.core.step.builder.StepBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BatchJobConfig {
@Bean
public Job importUserJob(JobBuilderFactory jobBuilderFactory, Step importUserStep) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.start(importUserStep)
.build();
}
@Bean
public Step importUserStep(StepBuilderFactory stepBuilderFactory,
UserItemReader reader,
UserItemWriter writer) {
return stepBuilderFactory.get("importUserStep")
.<User, User>chunk(10)
.reader(reader)
.writer(writer)
.build();
}
}
✔ Step과 Job을 정의하여 배치 작업 실행
✅ 여기까지 Spring Batch를 활용한 대용량 데이터 처리 방법을 배웠습니다!
👉 "그렇다면, Spring Security 기본 개념 및 인증 방식(JWT, OAuth2, Session 비교)은 어떻게 할까?"
✅ 다음 회차에서 **Spring Security 기본 개념 및 인증 방식 (JWT, OAuth2, Session 비교)**을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <16. Spring Security 기본 개념 및 인증 방식 (JWT, OAuth2, Session 비교)> (0) | 2025.04.02 |
---|---|
Spring 기초 <14. Spring Boot에서 Redis를 활용한 캐싱(Cache) 전략> (1) | 2025.03.31 |
Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현> (0) | 2025.03.30 |
Spring 기초 <12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)> (0) | 2025.03.29 |
Spring 기초 <11. Spring Data JPA vs MyBatis 차이 및 선택 기준> (1) | 2025.03.28 |
Spring 기초 <10. Spring에서 CORS 설정 및 글로벌 예외 처리 (Exception Handling)> (0) | 2025.03.27 |
Spring 기초 <9. Spring에서 DTO, Entity, VO의 차이 및 실무 적용법> (0) | 2025.03.26 |
Spring 기초 <8. Spring에서 RequestParam vs PathVariable 차이점> (0) | 2025.03.25 |