Spring Batch - 배치와 스프링

Spring Batch - 배치와 스프링

배치 처리란?

┌─────────────────────────────────────────────────────────────┐
│                     배치 처리의 정의                          │
├─────────────────────────────────────────────────────────────┤
│  상호작용이나 중단 없이 유한한 양의 데이터를 처리하는 것         │
│  → 시작되면 아무런 개입 없이 완료까지 실행                     │
└─────────────────────────────────────────────────────────────┘

일반 애플리케이션 vs 배치 처리

구분일반 애플리케이션배치 처리
사용자 상호작용있음 (클릭, 입력)없음
실행 방식이벤트 기반스케줄 기반
데이터 양소량 (건별 처리)대량 (일괄 처리)
실행 시점즉시정해진 시간

배치 처리를 사용하는 이유

1. 정보 수집 및 준비

실시간 처리                    배치 처리
────────────                   ────────
요청 → 즉시 처리               요청 수집 → 일괄 처리
                               (필요한 정보를 미리 수집 가능)

2. 비즈니스 효율성

예시: 온라인 쇼핑몰 배송

[즉시 배송]
주문 → 바로 배송 준비 → 취소 시 비용 큼

[배치 배송]
주문 → 몇 시간 대기 → 취소 가능 기간 제공 → 일괄 배송
                     ↳ 취소 비용 절감

3. 자원 효율적 활용

데이터 과학 모델링 예시

┌─────────────────┐     ┌─────────────────┐
│  1단계: 모델 생성  │  →  │  2단계: 모델 사용  │
│   (시간 소요)      │     │    (빠른 처리)    │
│   배치 처리 적합   │     │   스트리밍 적합    │
└─────────────────┘     └─────────────────┘

배치 처리가 직면한 과제

4가지 핵심 과제

과제설명고려 사항
사용성코드 중심의 사용성오류 처리, 디버깅 용이성, 단위 테스트
확장성대용량 데이터 처리병렬 처리, 분산 처리
가용성서비스 지속성장애 복구, 재시작 메커니즘
보안데이터 보호접근 제어, 암호화

사용성 관련 핵심 질문

✓ 공통 컴포넌트를 쉽게 확장할 수 있는가?
✓ 단위 테스트가 잘 구축되어 있는가?
✓ 실패 시 언제, 어디서, 왜 실패했는지 알 수 있는가?

Java + Spring Batch를 선택하는 6가지 이유

이유설명
유지보수성배치 코드는 일반 앱보다 수명이 길어 중요
유연성WORA (Write Once Run Anywhere)
확장성다양한 확장 방안 제공
개발 리소스풍부한 Java 개발자 풀
지원커뮤니티 및 기업 지원
비용오픈소스로 라이선스 비용 절감

배치 처리 확장 방안 비교

┌──────────────┬────────────────────────────┬──────────────────┐
│    방식      │          특징              │      제약        │
├──────────────┼────────────────────────────┼──────────────────┤
│ 메인프레임    │ 단일 하드웨어 내 병렬 처리  │ 용량 증설 제한    │
│ 커스텀 처리   │ 직접 구현                  │ 부하 분산 코딩 필요│
│ Spring Batch │ 프레임워크 지원            │ 상대적으로 적은 제약│
└──────────────┴────────────────────────────┴──────────────────┘

Spring Batch 주요 사용 사례

1. ETL (Extract, Transform, Load)

┌─────────┐     ┌─────────┐     ┌─────────┐
│ Extract │  →  │Transform│  →  │  Load   │
│  (추출)  │     │  (변환)  │     │  (적재)  │
└─────────┘     └─────────┘     └─────────┘
     ↓               ↓               ↓
  DB에서 읽기    비즈니스 로직    다른 DB에 저장

2. 데이터 마이그레이션

# 시스템 간 데이터 이전
Legacy System  ──────────→  New System
              Spring Batch

3. 병렬 처리

  • 멀티 코어 / 멀티 서버 분산 처리
  • 웹 애플리케이션과 동일한 객체/데이터 소스 접근 가능

4. 워크로드 조정

  • 시스템 부하 분산
  • 피크 타임 외 시간에 처리

Spring Batch 3-Layer 아키텍처

┌─────────────────────────────────────────────────────────────┐
│                   Application Layer                         │
│        (사용자 코드, 비즈니스 로직, Job 구성)                  │
│  ┌─────────────────────────────────────────────────────────┐│
│  │                    Core Layer                           ││
│  │          (Job, Step, JobLauncher, JobParameters)        ││
│  │  ┌─────────────────────────────────────────────────────┐││
│  │  │              Infrastructure Layer                   │││
│  │  │    (ItemReader, ItemWriter, 재시작, 재시도 로직)      │││
│  │  └─────────────────────────────────────────────────────┘││
│  └─────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘

각 레이어 역할

레이어역할예시
Application사용자 코드, 비즈니스 로직Job 구성, 서비스 클래스
Core배치 도메인 정의Job, Step, JobLauncher
Infrastructure공통 인프라ItemReader, ItemWriter, 재시도

Spring Batch Job 기본 구조

개념적 구조

Job
 └── Step 1
 │    └── Tasklet or (ItemReader → ItemProcessor → ItemWriter)
 └── Step 2
 │    └── Tasklet or (ItemReader → ItemProcessor → ItemWriter)
 └── Step N
      └── ...

기본 Job 정의 예제

@Configuration
@EnableBatchProcessing
public class BatchConfig {

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Tasklet accountTasklet() {
        return (contribution, chunkContext) -> {
            // 비즈니스 로직 수행
            System.out.println("계좌 처리 중...");
            return RepeatStatus.FINISHED;
        };
    }

    @Bean
    public Step accountStep() {
        return stepBuilderFactory.get("accountStep")
                .tasklet(accountTasklet())
                .build();
    }

    @Bean
    public Job accountJob() {
        return jobBuilderFactory.get("accountJob")
                .start(accountStep())
                .build();
    }
}

실행 흐름

Spring Boot 시작
      ↓
ApplicationContext 로드
      ↓
@EnableBatchProcessing으로 인프라 구성
      ↓
Job Bean 발견
      ↓
JobLauncher가 Job 자동 실행

관련 Spring Cloud 프로젝트

Spring Cloud Task

┌─────────────────────────────────────────┐
│          Spring Cloud Task              │
├─────────────────────────────────────────┤
│ • 클라우드 환경의 유한한 태스크 실행      │
│ • Spring Batch와 통합                   │
│ • 동적 확장 기능                         │
│ • Job 시작/종료 이벤트 메시지 제공        │
└─────────────────────────────────────────┘

Spring Cloud Data Flow

┌─────────────────────────────────────────┐
│       Spring Cloud Data Flow            │
├─────────────────────────────────────────┤
│ • 마이크로서비스 오케스트레이션           │
│ • 지원 플랫폼:                           │
│   - Cloud Foundry                       │
│   - Kubernetes                          │
│   - Local                               │
│ • 배치 앱의 동적 배포                    │
└─────────────────────────────────────────┘

흔한 오해 바로잡기

❌ 오해: Spring Batch는 스케줄러다

✅ 사실: Spring Batch는 스케줄러가 아님!
        프레임워크 내에 스케줄링 기능이 없음

┌─────────────────────────────────────────┐
│     Job 실행을 위한 별도 스케줄러 필요     │
├─────────────────────────────────────────┤
│ • Cron (리눅스 스케줄러)                 │
│ • Quartz (Java 스케줄러)                │
│ • Control-M (엔터프라이즈 스케줄러)       │
│ • Jenkins (CI/CD + 스케줄링)            │
│ • Kubernetes CronJob                    │
└─────────────────────────────────────────┘

핵심 용어 정리

용어설명
Job하나 이상의 Step으로 구성된 배치 작업 단위
StepJob을 구성하는 독립적인 작업 단위
Tasklet단순한 단일 태스크 실행 인터페이스
ETLExtract(추출), Transform(변환), Load(적재)
Chunk일정 개수의 아이템을 묶어 처리하는 단위
WORAWrite Once Run Anywhere (Java 특성)