-
Spring Batch란?프로젝트/스프링 배치 튜토리얼 2023. 2. 4. 00:01728x90
Spring Batch 공식문서
https://docs.spring.io/spring-batch/docs/current/reference/html/
Spring Batch의 등장 배경
Batch란 사전적으로 일관 처리라는 뜻을 가집니다.
만약 매일 전 날의 데이터를 집계해야 한다고 가정해보겠습니다.
이때 큰 데이터를 읽고, 가공하고 저장한다면 해당 서버는 순식간에 많은 CPU, I/O 등의 자원을 사용하게 됩니다.
이렇게 되면 해당 서버는 다른 Request 처리를 못하게 됩니다.
또한 큰 데이터를 처리하다가 10만 번째에서 실패했다면 10만 1번째부터 다시 실행할 수 있다면 자원을 효율적으로 사용할 수 있을 것입니다.
이를 막을 수 있을까요?
또한 누군가 API를 2번 호출하게 된다면 집계 데이터가 이상해질 수 있으며, 자원이 낭비될 수 있습니다.
이를 막을 수 있을까요?
이처럼 비즈니스 로직 외에 부가적으로 신경 써야 할 부분들이 많습니다.
웹 애플리케이션을 개발할 때 Spring MVC를 사용함으로 비즈니스 로직에 최대한 집중할 수 있는 것처럼 Spring Batch를 사용하게 되면 배치 애플리케이션의 비즈니스 로직에 집중할 수 있습니다.
배치 애플리케이션의 조건
- 대용량 데이터 : 대량의 데이터를 가져오거나, 전달, 계산할 수 있어야 합니다.
- 자동화 : 일반적으로 사용자 개입 없이 실행되어야 합니다.
- 견고성 : 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 합니다.
- 신뢰성 : 잘못된 부분을 추적할 수 있어야 합니다
- 성능 : 다른 애플리케이션을 방해하지 않도록 수행되어야 하며, 지정한 시간 안에 처리를 완료해야 합니다.
Spring Batch란?
Spring Batch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 기능을 제공합니다.
- 최적화와 파티셔닝 기술을 통해 대용량 및 고성능 배치 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공합니다.
- 작업이 재시작되는 경우에는 처음부터가 아닌 실패한 지점부터 실행하게 됩니다.
- 중복 실행을 막기 위해 성공한 이력이 있는 Batch는 동일한 Parameters로 실행 시 Exception이 발생하게 됩니다.
즉, 엔터프라이즈 시스템 운영에 있어 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크입니다.
Spring의 특성을 그대로 가져왔기 때문에 DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있습니다.
Batch와 스케줄러의 차이
보통 Spring Batch와 Quartz(스케줄러)를 많이 비교하곤 합니다.
하지만 둘의 역할을 완전히 다릅니다.
Spring Batch는 스케줄러의 기능을 제공하지 않습니다.
Quartz는 스케줄러의 역할을 수행하며, Batch와 같이 대용량 데이터 배치 처리에 대한 기능을 지원하지 않습니다.
Batch 역시 Quartz의 다양한 스케줄 기능을 지원하지 않습니다.
따라서 보통은 Quartz + Batch를 조합해서 사용하곤 합니다.
Spring Batch 용어
Job: 배치 처리 과정을 하나의 단위로 만들어 놓은 객체
JobInstance : Job의 실행의 단위, Job을 실행시키게 되면 Job의 name과 Paramaeter의 해쉬값으로 하나의 고유한 JobInstance가 생성됩니다. 예를 들어 하나의 Job에 대해 1월 1일 실행, 1월 2일 실행을 하게 되면 각각의 JobInstance가 생성되어 1월 1일 실행한 JobInstance가 실패하여 다시 실행해도 해당 JobInstance는 1월 1일에 대한 데이터만 처리하게 됩니다.
(JobInstance가 있으면 기존 JobInstance반환, 없으면 새로 만들어 반환)
JobParameters : Job으로부터 만들어지는 JobInstance를 구별하기 위해 JobParameters 객체로 구분합니다. 구별 외에도 JobInstance에 전달되는 매개변수 역할도 수행합니다. (JobParameter 예시: requestDate = 20230918)
JobExecution : JobInstance에 대한 실행 시도에 대한 객체입니다. 1월 1일에 실행한 JobInstance가 실패하여 재실행하여도 동일한 JobInstance를 실행시키지만 이 2번에 실행에 대한 JobExecution은 개별로 생기게 됩니다. JobExecution은 이러한 JobInstance 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담고 있습니다.
step : Job의 배치 처리를 정의하고 순차적인 단계를 캡슐화합니다. Job은 최소한 1개 이상의 Step을 가져야 하며 Job의 실제 일괄 처리를 제어하는 모든 정보가 들어가 있습니다.
stepExecution: JobExecution과 동일하게 Step 실행 시도에 대한 객체를 나타냅니다. 하지만 Job이 여러 개의 Step으로 구성되어 있을 경우 이전 단계의 Step이 실패하게 되면 다음 단계가 실행되지 않음으로 실패 이후 StepExecution은 생성되지 않습니다. read 수, write 수, commit 수, skip 수 등의 정보들도 저장이 됩니다.
ExecutionContext: Job에서 데이터를 공유할 수 있는 데이터 저장소입니다. JobExecutionContext, StepExecutionContext 2가지 종류가 있습니다. JobExecutionContext는 Commit 시점에 저장되는 반면에 StepExecutionContext는 실행 사이에 저장이 되게 됩니다. ExecutionContext를 통해 Step 간 데이터 공유가 가능하며 Job 실패 시 ExecutionContext를 통한 마지막 실행 값을 재 구성할 수 있습니다.
JobRepository: 위의 모든 배치 처리 정보를 담고 있는 메커니즘입니다. Job이 실행되게 되면 JobRepository에 JobExecution과 StepExecution을 생성하게 되며 JobRepository에서 Execution 정보들을 저장하고 조회하며 사용하게 됩니다.
JobLancher: Job과 JobParameters를 사용하여 Job을 실행하는 객체입니다.
ItemReader: Step에서 Item을 읽어오는 인터페이스입니다. ItemReader에 대한 다양한 인터페이스가 존재하며 다양한 방법으로 Item을 읽어 올 수 있습니다.
ItemWriter: 처리된 Data를 Writer 할 때 사용합니다. Writer는 처리 결과물에 따라 Insert가 될 수도 Update가 될 수도 Quene를 사용한다면 Send가 될 수도 있습니다. Reader와 동일하게 다양한 인터페이스가 존재합니다.
기본적으로 Item을 Chunk로 묶어 처리하고 있습니다.
참고자료
https://jojoldu.tistory.com/324
'프로젝트 > 스프링 배치 튜토리얼' 카테고리의 다른 글
Spring Batch 데이터베이스와 함께 사용하기 (0) 2023.10.11 Spring Batch 프로젝트 생성하기 - Spring Boot 3.1 (0) 2023.10.09 JobParameters Intellij 환경 변수 설정 (0) 2023.02.14 SpringBatch Cursor 기반 vs Paging 기반 (0) 2023.02.07 Spring Batch 프로젝트 생성하기 - Spring Boot 2.7.5 (0) 2023.02.05