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

❗주의사항 : Infrastructure beans configuration with @EnableBatchProcessing

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를 지속적으로 사용한다.
  • 배치 : 배치는 필요할 때만 실행된다. 작업이 끝나면 리소스를 반환하고 종료된다.
  • 스프링 배치는 트랜잭션 관리 기능을 제공한다.
    • 체크포인트 기능 : 긴 배치 작업 중간에 안전 지점을 설정. 문제 발생 시 처음이 아닌 마지막 체크포인트부터 재시작 가능
    • 유연한 트랜잭션 범위 설정 : 처리할 데이터 양과 특성에 따라 트랜잭션 범위 조절 가능. 작은 단위의 커밋으로 메모리 사용량 조절 가능