Spring Batch란
Spring Batch는 대용량 일괄처리의 편의를 위해 설계된 배치 프레임워크입니다.
Spring의 특성을 그대로 가져왔기 때문에, DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있습니다.
사용하는 경우
- 대용량의 비즈니스 데이터를 복잡한 작업으로 처리해야 하는 경우
- 특정한 시점에 스케쥴러를 통해 자동화된 작업이 필요한 경우
- 대용량의 데이터의 포맷을 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야 하는 경우
저는 Spring Batch를 통해 데이터 마이그레이션 처리와 스케쥴러 용도로 사용했습니다.!
최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 일괄 작업을 가능하게 하는 기능을 제공합니다.
배치 애플리케이션은 다음의 조건을 만족해야만 한다.
- 대용량 데이터 : 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 한다.
- 자동화 : 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 한다.
- 견고성 : 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 한다.
- 신뢰성 : 무엇이 잘못되었는지를 추적할 수 있어야 한다. (로깅, 알림)
- 성능 : 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 애플리케이션을 방해하지 않도록 수행되어야 합니다.
Spring Batch Architecture
- Application : Spring Batch를 사용하여 개발자가 작성한 모든 배치 작업과 사용자 정의 코드
- Batch Core : 배치 작업을 시작하고 제어하는 데 필요한 핵심 런타임 클래스를 포함
- Batch Infrastructure : 개발자와 애플리케이션에서 사용하는 일반적인 Reader와 Writer 그리고 RetryTemplate과 같은 서비스를 포함
스프링 배치는 계층 구조가 위와 같이 설계되어 있기 때문에 개발자는 Application 계층의 비즈니스 로직에 집중할 수 있고,
배치의 동작과 관련된 것은 Batch Core에 있는 클래스들을 이용하여 제어할 수 있습니다.
JobRepository
다양한 배치 수행과 관련된 수치 데이터와 Job의 상태를 유지 및 관리합니다.
실행된 Step, 현재 상태, 읽은 아이템 및 처리된 아이템 수 등이 모두 JobRepository에 저장됩니다.
Job
배치 처리 과정을 하나의 단위로 만들어 표현한 객체입니다. 여러 Step 인스턴스를 포함하는 컨테이너입니다.
JobLauncher
Job을 실행하는 역할을 담당합니다. (Job.executer 호출)
Job의 재실행 가능 여부, Job의 실행 방법, 파라미터 유효성 검증 등을 수행합니다.
스프링부트 환경에서는 Boot가 Job을 시작하는 기능을 제공하므로, 일반적으로 직접 다룰 필요가 없습니다.
Job을 실행하면 해당 Job은 각 Step을 실행합니다. -> 각 Step이 실행되면 JobRepository는 현재 상태로 갱신됩니다.
Step
스프링 배치에서 가장 일반적으로 상태를 보여주는 단위입니다.
각 Step은 Job을 구성하는 독립된 작업의 단위입니다.
- Tasklet, Chunk 기반으로 2가지가 있다.
Chunk
한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만듭니다.
Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 됩니다.
Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter라는 3개의 인터페이스로 구성될 수 있습니다.
ItemReader와 ItemProcessor에서는 데이터 1건씩 처리하고, ItemWriter에선 Chunk 단위로 처리됩니다.