🧮Batch
배치 애플리케이션(batch application)은 대량의 데이터를 처리하고 일괄적으로 작업을 실행하는 소프트웨어입니다.
🥇스프링 배치의 장점
대량의 데이터를 처리하려고 한다면, Spring MVC를 이용해 처리한다거나 DB 프로시저를 통해 처리할 수도 있을텐데 왜 Spring Batch를 사용하는 것일까요? 스프링 배치를 적용했을 때의 장점은 아래와 같습니다.
- 버전관리, 배포를 웹어플리케이션과 같은 방식으로 할 수 있다.
- 부분적인 테스트나, 작업 모니터링에 있어 유리하다.(500번째 작업에서 실패한다면 거기서부터 다시 시작 가능)
- 사용자의 요청과는 별도로 실행하여 서버의 CPU와 I/O 자원에 있어 서버의 부담을 덜어준다.
- spring의 장점을 그대로 활용가능하여 모듈화를 통해 확장성 있는 설계 가능하다.
🔔배치 애플리케이션의 특징
- 대용량 데이터 — 배치 어플리케이션은 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 합니다.
- 자동화 — 배치 어플리케이션은 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 합니다.
- 견고성 — 배치 어플리케이션은 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
- 신뢰성 — 배치 어플리케이션은 무엇이 잘못되었는지를 추적할 수 있어야 합니다. (로깅)
- 성능 — 배치 어플리케이션은 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 어플리케이션을 방해하지 않도록 수행되어야합니다.
- 실패 복구 — 만약 처리 중에 실패가 발생하면, 실패 지점부터 재시작 할 수 있는 기능을 제공합니다.
🗒Spring Batch? Scheduler? Quartz?
배치와 스케줄링의 역할은 다르며 상호 보완적입니다. 보통 배치 + 스케줄링의 조합을 사용하여 정해진 일정마다 배치를 실행시킵니다. 주로 Quartz나 Jenkins, Scheduler중 하나를 사용합니다.
🔧스프링 배치의 아키텍처
JobRepository
JobRepository는 배치 작업(Job)의 메타데이터를 관리하고, 배치 실행 상태를 추적하기 위한 인터페이스입니다. 즉, 배치 작업의 실행 정보, 실행 상태, 실행 결과 등을 데이터베이스에 저장하고 조회할 수 있는 기능을 제공합니다.
JobLauncher
배치 작업(Job)을 실행하기 위한 인터페이스입니다. 배치 애플리케이션에서 Job을 실행하고 관리하기 위해 사용됩니다.
Job
Job은 하나의 독립적인 배치 작업을 나타냅니다. 특정 비즈니스 로직을 수행하는 일련의 스텝(단계)을 정의하고, 이를 실행하는 단위입니다. 하나의 Job은 1개 이상의 Step으로 구성됩니다.
Step
Step은 실제 배치 처리 작업이 이루어지는 단위입니다. 각 Step 내부에서는 ItemReader, ItemProcessor, ItemWriter를 사용하는 chunk 방식 또는 Tasklet 하나를 가질 수 있습니다.
ItemReader
ItemReader는 Step에서 Item을 읽어오는 인터페이스입니다. 대량의 데이터를 읽어오는 역할을 담당합니다. 주로 외부 소스에서 데이터를 읽어와 배치 처리 작업에 제공하는 데 사용됩니다.
ItemProcessor
Item Processor는 Reader에서 읽어온 Item을 데이터를 처리하는 역할을 담당합니다. 주로 읽어온 데이터를 가공하거나 필터링하여 다음 단계로 전달하는 데 사용됩니다.
ItemWriter
ItemWriter는 배치 작업에서 처리한 데이터를 외부 저장소에 쓰는 역할을 담당합니다. 주로 데이터베이스에 결과를 저장하거나 파일에 결과를 쓰는 등의 작업에 사용됩니다. Writer는 처리 결과물에 따라 Insert가 될 수도 Update가 될 수도 Queue를 사용한다면 Send가 될 수도 있습니다.
🛒메타 테이블
스프링 배치는 배치 작업을 관리하기 위해 메타 데이터를 저장하는 6개의 테이블을 자동으로 생성하여 사용합니다.
- BATCH_JOB_INSTANCE : 배치 작업(Job)의 실행 인스턴스를 관리하는 데 사용되는 테이블입니다. 이 테이블은 스프링 배치의 메타 데이터를 저장하고 조회하는 데 사용됩니다.
- BATCH_JOB_EXECUTION : 배치 작업(Job)의 실행 이력을 저장하는 데 사용되는 테이블입니다. 이 테이블은 각 배치 작업 실행에 대한 상세 정보를 추적하고 관리합니다.
- BATCH_JOB_EXECUTION_PARAMS : 배치 작업(Job) 실행 시 전달된 파라미터(Job Parameter) 정보를 저장하는 테이블입니다. 이 테이블은 각 배치 작업 실행에 전달된 파라미터들을 저장하고 추적하는 데 사용됩니다.
- BATCH_JOB_EXECUTION_CONTEXT : 배치 작업(Job) 실행 중에 사용되는 컨텍스트 정보를 저장하는 테이블입니다. 이 테이블은 각 배치 작업 실행에 대한 컨텍스트 정보를 저장하고 추적하는 데 사용됩니다.
- BATCH_STEP_EXECUTION : 각 단계(Step)의 실행 이력을 저장하는 테이블입니다. 이 테이블은 각 스텝 실행에 대한 상세 정보를 추적하고 관리하는 데 사용됩니다.
- BATCH_STEP_EXECUTION_CONTEXT : 각 단계(Step)의 실행 중에 사용되는 컨텍스트 정보를 저장하는 테이블입니다. 이 테이블은 각 스텝 실행 중에 필요한 컨텍스트 정보를 저장하고 추적하는 데 사용됩니다.
🚀Spring Batch 사용 예제
1. Spring Batch 의존성 추가
// spring batch
implementation 'org.springframework.boot:spring-boot-starter-batch'
2.application.yml 설정 추가
spring:
batch:
job:
enabled: true
jdbc:
initialize-schema: never
spring.batch.jdbc.initialize-schema 설정은 always, embeded, never로 설정이 가능합니다. 개발 시에는 자동 생성 방법을, 운영 시에는 수동 생성 방법을 추천합니다.
3. @EnableBatchProcessing을 추가(batch 4버전 이하)
@EnableBatchProcessing
@SpringBootApplication
public class BatchApplication {
public static void main(String[] args) {
SpringApplication.run(BatchApplication.class, args));
}
}
4. Job
@Slf4j
@Configuration
@RequiredArgsConstructor
public class JobConfig {
private final Step stockPriceCalculationStep;
@Bean
public Job testJob(JobRepository jobRepository) {
return new JobBuilder("stockPriceCalculationJob", jobRepository)
.start(stockPriceCalculationStep)
.build();
}
}
- JobRepository
- Spring Batch 내에서 사용되는 다양한 도메인 객체들의 기본적인 CRUD 작업에 이용
- Job을 생성하기위해 기본적으로 필요.
5. Step
@Slf4j
@Configuration
@RequiredArgsConstructor
public class StepConfig {
private final ItemReader<List<Stock>> stockCalculationReader;
private final ItemProcessor<List<Stock>, AveragePriceGraphListResponseDto> stockCalculationProcessor;
private final ItemWriter<AveragePriceGraphListResponseDto> stockCalculationWriter;
@Bean
public Step stockPriceCalculationStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("stockPriceCalculationStep1", jobRepository)
.<List<Stock>, AveragePriceGraphListResponseDto>chunk(10, transactionManager)
.reader(stockCalculationReader)
.processor(stockCalculationProcessor)
.writer(stockCalculationWriter)
.build();
}
}
- PlatformTransactionManager
- Spring Framework에서 트랜잭션 관리를 추상화하는 인터페이스
6. ItemReader, ItemProcessor, ItemWriter
구현하는 비즈니스 로직, 사용하는 DB, ORM에 따라 역할에 맞게 구현
잘 동작하는 모습.
Spring Batch를 작성하기 위한 아주 기초적인 지식 정리를 마쳤습니다. 이 배치를 자동으로 실행시키키 위한 스케줄러에 대해 추가로 공부하면 좋을 것 같습니다😀