
배치 프로그램은 데이터를 실시간으로 처리하는 것이 아닌, 일괄적으로 모아서 한번에 처리하는 작업을 말한다. 대표적인 배치 작업으로 정산 시스템, (월별,분기별,연간) 보고서 자동 생성 등이 있다.
배치 프로그램은 일관되고 정확한 결과를 보장하며, 시스템 사용률을 고려해서 배치 작업을 실행하여 서버 리소스를 효율적으로 사용할 수 있다.
Spring Batch는 이러한 배치 프로그램을 개발자가 쉽게 구현할 수 있도록 지원한다. 관심사를 명확하게 분리해서 각 관심사 별 인터페이스를 제공함으로써 배치 프로그램을 쉽게 구현할 수 있다.
Spring Batch를 스케줄러로 오해할 수도 있다. 하지만 Spring Batch는 스케줄링 프레임워크가 아니며, 스케줄러를 대체하기 보다는 스케줄러와 함께 작동하도록 설계되었다.

Job을 실행할 때 필요한 매개변수를 받아서 Job을 실행한다.
JobInstance, JobExecution, StepExecution과 같은 배치 관련 객체들에 대한 CRUD 작업을 처리한다.
작업의 단위를 뜻하며, 하나의 Job에는 여러 개의 Step이 있다.
하나의 독립적이고 순차적인 처리 단계를 의미하는 객체이다.
Step의 흐름을 제어할 수 있다. Job에는 여러 Step이 있을 수 있는데, 특정 Step이 실패, 성공 시 실행 할 Step을 설정할 수 있고, 특정 조건에 따라서 Step을 스킵할 수 있도록 만들 수 있다.
지연 바인딩을 지원한다. 이를 통해서 실행 시점에 사용할 bean을 실행 중에 주입하면서, 유연하게 배치 작업을 설정할 수 있다.
Job이 실행될 때에만 bean이 생성되는 @JobScope , Step이 실행될 때에만 bean이 생성되는 @StepScope가 있다.
@JobScope는 멀티 스레드에서의 사용을 권장하지 않는다. Bean같은 경우에 프록시로 동작하기 때문에 단일 인스턴스만 생성된다. 멀티 스레드 환경에서는 동일한 인스턴스를 공유하게 되고, 이로 인해 데이터 충돌이나 불일치가 발생할 수 있다. 그에 반면 @StepScope의 Bean은 스레드마다 인스턴스가 생성되기 때문에 thread-safe하다.
각 Step 별로 Chunk 기반으로 실행되거나, Tasklet으로 실행될 수 있다.
데이터를 하나씩 읽어서 일정한 묶음으로 모아서 처리한다.

데이터를 하나씩 읽어서 묶음을 만든다.
해당 묶음을 Processor로 전달해, 변환하거나 필터링한다.
변환된 데이터만 Writer로 전달하여 데이터를 저장한다.
데이터를 쓰고 나면 트랜잭션을 커밋해서 처리된 내용을 확정한다.
데이터를 반복해서 읽고 쓰는 것이 아닌 단일 작업을 처리해야 할 때 TaskletStep을 사용할 수 있다.
File, XML, Database 등 다양한 방식으로 데이터를 하나씩 순차적으로 읽어오는 역할을 한다. 더 이상 읽을 데이터가 없을 경우 null을 반환하여 read 연산을 중단한다.
데이터를 변환, 필터링, 검증하는 비즈니스 로직을 담당한다. 여러 Processor를 체이닝해서 만든 복잡한 변환 로직이나, 데이터 필터링 로직을 담는다. 필터링을 할 때 null을 반환하면 해당 데이터는 Writer로 전달되지 않는다.
데이터를 출력하거나 저장하는 역할을 하며, 출력 대상으로 파일, 데이터베이스, 큐 등 다양한 형식이 될 수 있다. 데이터를 한번에 한 항목씩 읽어오는 Reader와 달리, Writer는 데이터를 일정량씩 모아서 한꺼번에 처리하면서 성능을 향상시킨다.
Spring Batch에 관해 간단하게 학습할 수 있었다.
다음은 각 Step 별로 구현 및 단위 테스트를 작성하는 방식에 대해 학습하고자 한다.