IT Developer/Spring

Spring 기초 <15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현>

TEMA_ 2025. 4. 1. 13:49
반응형

스프링 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 비교)**을 배워봅시다!

 

반응형