Spring Batch ‐ 스프링 배치 시작 - thought-corner/backend-roadmap GitHub Wiki
스프링 배치 활성화
@EnableBatchProcessing: 스프링 배치가 작동하기 위해 선언해야 하는 어노테이션
@SpringBootApplication
@EnableBatchProcessing
public class ModuleBatchApplication {
public static void main(String[] args) {
SpringApplication.run(ModuleBatchApplication.class, args);
}
}
- 총 4개의 설정 클래스를 실행시키며 스프링 배치의 모든 초기화 및 실행 구성이 이루어진다.
- 스프링 부트 배치의 자동 설정 클래스가 실행됨으로 빈으로 등록된 모든 Job을 검색해서 초기화와 동시에 Job을 수행하도록 구성된다.
스프링 배치 초기화 설정 클래스
* BatchAutoConfiguration
- 스프링 배치가 초기화 될 때, 자동으로 실행되는 설정 클래스
- Job을 수행하는 JobLauncherApplicationRunner 빈을 생성
* SimpleBatchConfiguration
- JobBuilderFactory와 StepBuilderFactory 생성
- 스프링 배치의 주요 구성 요소들이 프록시 객체로 생성
* BatchConfigurerConfiguration - BasicBatchConfigurer
- BasicBatchConfigurer : SimpleBatchConfiguration에서 생성한 프록시 객체의 실제 대상 객체를 설정하는 클래스
- 빈으로 의존성 주입 받아서 주요 객체들을 참조해서 사용할 수 있다.
* BatchConfigurerConfiguration - JpaBatchConfigurer
- JPA 관련 객체를 생성하는 설정 클래스
❗주의사항 : Spring Batch 설정 방법 차이 존재
- 버전이 올라감에 따라 강의 내용에서 많이 바뀐 부분도 존재한다.
- 다음 레퍼런스들을 참고해서 공부하면 좋을 것 같아 남긴다.
스프링 배치 관련 용어
- @Configuration 선언 : 하나의 배치 Job을 정의하고 빈을 설정한다.
- JobBuilderFactory : Job을 생성하는 빌더 팩토리
- StepBuilderFactory : Step을 생성하는 빌더 팩토리
- Job : Job 생성
- Step : Step 생성
- tasklet : Step 안에서 단일 태스크로 수행되는 로직을 구현
- Job을 구동 → Step을 실행 → Tasklet을 실행
❗주의사항 : JobBuilderFactory and StepBuilderFactory bean exposure/configuration
- JobBuilderFactory & StepBuilderFactory deprecated
- Spring Batch v5로 업그레이드 됨에 따라 JobBuilderFactory 대신 JobBuilder, StepBuilderFactory 대신 StepBuilder를 사용한다.
❗주의사항 : Infrastructure beans configuration with @EnableBatchProcessing
- Transaction manager bean exposure/configuration
- 참고 이슈
@EnableBatchProcessing어노테이션은 Spring Boot 3.x 버전에서 사용하지 않는다.
Batch DB 스키마 생성 및 이해
- 스프링 배치 메타 데이터란?
- 스프링 배치의 실행 및 관리를 위한 목적으로 여러 도메인들의 정보를 저장, 업데이트, 조회할 수 있는 스키마를 제공한다.
- 과거, 현재의 실행에 대한 세세한 정보, 실행에 대한 성공과 실패 여부 등을 일목요연하게 관리함으로서 배치 운용에 있어 리스크 발생 시 빠른 대처가 가능하다.
- DB와 연동할 경우 필수적으로 메타 테이블이 생성되어야 한다.
- 스키마 생성 설정
- 수동 생성
- 자동 생성
- ALWAYS : 스크립트 항상 실행, RDBMS 설정이 되어 있을 경우 내장 DB보다 우선적으로 실행된다.
- EMBEDDED : 내장 DB일 때만 실행되며 스키마가 자동 생성된다.
- NEVER : 스크립트 항상 실행 안함, 내장 DB일 경우 오류가 발생한다.
- Job 관련 테이블
BATCH_JOB_INSTANCE: Job이 실행될 때 JobInstance 정보가 저장되며, job_name과 job_key를 키로 하여 하나의 데이터가 저장되며, 동일한 job_name과 job_key가 중복 저장될 수 없다.BATCH_JOB_EXECUTION: job의 실행 정보가 저장되며 Job 생성, 시작, 종료 시간, 실행 상태, 메시지 등을 관리한다.BATCH_JOB_EXECUTION_PARAMS: Job과 함께 실행되는 JobParameter 정보를 저장한다.BATCH_JOB_EXECUTION_CONTEXT: Job의 실행동안 여러가지 상태 정보, 공유 데이터를 직렬화해서 저장하고 Step간 서로 공유가 가능하다.
- Step 관련 테이블
BATCH_STEP_EXECUTION: Step의 실행 정보가 저장되며 생성, 시작, 종료 시간, 실행 상태, 메시지 등을 관리한다.BATCH_STEP_EXECUTION_CONTEXT: Step의 실행동안 여러가지 상태 정보, 공유 데이터를 직렬화해서 저장하고 Step간 서로 공유가 불가능하다.
웹과 배치의 차이점 정리
- 웹 : 사용자가 요청하면 즉각적으로 처리한다. 클릭하거나 데이터를 입력하면 그 순간 서버가 요청을 받아 JSON, HTML 등의 결과를 돌려준다. 이게 웹 애플리케이션의 본질이다. 실시간 반응이 핵심이다.
- 배치 : 배치는 사용자의 요청을 기다리지 않는다. 정해진 스케줄에 따라 작업이 자동으로 실행된다. 특정 시점에 대량 데이터를 처리하거나 주기적으로 실행되는 작업에서 빛을 발한다.
결과의 속도
- 웹 : 사용자 요청에 즉각 응답하는 것이 생명이다. 페이지 로딩이 1초만 느려져도 사용자는 떠난다. 실시간 피드백이 가장 중요하다.
- 배치 : 배치에서는 결과의 속도보다 정확성과 완결성이 우선이다. 데이터 처리에 시간이 걸리더라도 대량 데이터를 완벽하게 처리하는 것이 목표다.
처리량의 차이
- 웹 : 한 번에 한 사용자의 요청을 처리한다. 한 명의 사용자가 상품을 검색하거나 주문을 할 때, 그 요청만 처리하면 된다.
- 배치 : 대량의 데이터를 효율적으로 처리한다. 수백만 건의 데이터를 한 번에 처리하는 것이 기본이다.
오류 처리
- 웹 : 잘못된 요청이 오면, 즉시 에러 코드를 반환하고 끝낸다. 사용자에게 문제를 알리고, 서버는 다음 요청을 기다린다.
- 배치 : 배치는 복구에 초점을 맞춘다. 문제가 발생하면 재시도하고, 실패가 반복되면 중단한 뒤 로그와 알림으로 관리자를 호출한다. 문제를 해결한 후 실패한 작업을 재시작하는 것이 일반적이다.
리소스 사용
- 웹 : 서버는 상시 실행 중이다. 사용자가 요청하지 않는 시간에도 대기 상태로 유지되며, 메모리와 CPU를 지속적으로 사용한다.
- 배치 : 배치는 필요할 때만 실행된다. 작업이 끝나면 리소스를 반환하고 종료된다.
- 스프링 배치는 트랜잭션 관리 기능을 제공한다.
- 체크포인트 기능 : 긴 배치 작업 중간에 안전 지점을 설정. 문제 발생 시 처음이 아닌 마지막 체크포인트부터 재시작 가능
- 유연한 트랜잭션 범위 설정 : 처리할 데이터 양과 특성에 따라 트랜잭션 범위 조절 가능. 작은 단위의 커밋으로 메모리 사용량 조절 가능