참조:https://deeplify.dev/back-end/spring/batch-tutorial
스프링 배치(Spring Batch)
배치 프로세싱은 일괄처리하는 뜻을 가지고 있다.
일괄처리의 의미는 일련의 작업을 정해진 로직으로 수행하는 것이라고 할 수 있다.
이런 일괄처리는 어떠한 경우에 필요할까?
- 대용량의 비즈니스 데이터를 복잡한 작업으로 처리해야하는 경우
- 특정한 시점에 스케쥴러를 통해 자동화된 작업이 필요한 경우(ex. 푸시알림,월별 리포트)
- 대용량 데이터의 포맷을 변경,유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야하는 경우
위와 같은 경우에 어플리케이션을 작성하여 처리하게된다.실제로 엔터프라이즈 환경에서는 정말 다양한 종류의 작업들을 배치를 이용하여 처리하고 있다.
스프링 팀은 위와 같은 요구사항을 처리해 줄 수 있는 배치와 관련된 어플리케이션 제작의 편의를 위해서 스프링 배치 프레임워크를 만들어 표준화하게 되었다.
배치의 일반적인 사용 시나리오

- 데이터베이스,파일 또는 큐에서 데이터 읽기
- 데이터를 정의한 방식으로 처리
- 처리된 데이터를 데이터 쓰기
스프링 배치는 위와 같은 방식으로 사용자와 상호작용 없이 반복적으로 데이터를 트랜잭션 단위로 처리할 수 있도록 구현되어 있고,개발자는 데이터 처리에 대한 비즈니스 로직에만 집중하여 배치 프로세스를 작성할 수 있다.
스프링 배치가 제공할 수 있는 비즈니스 시나리오
- 주기적인 배치 프로세스
- 동시적인 배치 프로세스:작업의 병렬 처리
- 단계별 엔터프라이즈 메시지 기반 처리
- 대규모 작업에 대한 병렬 배치 프로세스
- 실패 후 수동 또는 예약 된 재시작
- 단계별 순차 처리
- 부분 처리:레코드 건너 뛰기(예: 롤백 시)
- 배치 작업 처리의 단위가 작은 경우, 기존 저장 프로시저/스트립트가 있는 경우 전체 배치에 대한 트랜잭션 처리
스프링 배치 프레임워크는 위와 같이 다양한 비즈니스 시나리오를 처리할 수 있도록 설계되어 있다.
스프링 배치 계층 구조

스프링 배치 프레임워크는 확장성과 최종사용자를 염두해두고 설계되었기 때문에
위와 같이 Application,Batch Core 그리고 Batch Infrastructure로 설계되었다.
Application:개발자가 작성한 모든 배치 작업과 사용자 정의 코드 포함
Batch Core:배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스 포함
Batch Infrastructure:개발자와 어플리케이션에서 사용하는 일반적인 Reader와 Writer 그리고 RetryTemplate와 같은 서비스 포함
스프링 배치는 계층 구조가 위와 같이 설계되어 있기 때문에 개발자는 Application 계층의 비즈니스 로직에 집중할 수 있고 배치의 동작과 관련된 것은 Batch Core에 있는 클래스들을 이용하여 제어할 수 있다.
배치 원칙 및 가이드
- 일반적으로 같은 서비스 환경에서 동작하는 서비스와 배치는 서로에게 영향을 미칠 수 있기 때문에 배치와 서비스에 영향을 최소화 할 수 있도록 구조와 환경에 맞게 디자인해야 한다.
- 배치 어플리케이션 내에서 가능한한 복잡한 로직은 피하고 단순하게 설계해야 한다.
- 데이터 처리하는 곳과 데이터의 저장소는 물리적으로 가능한한 가까운 곳에 위치하도록 한다.
- 데이터베이스 I/O,네트워크 I/O,파일 I/O 등의 시스템 리소스의 사용을 최소화 하고 최대한 많은 데이터를 메모리 위에서 처리하도록 한다.
- 처리 시간이 많이 걸리는 작업을 시작하기 전에 메모리 재할당에 소모되는 시간을 피하기 위해 충분한 메모리를 할당한다.
- 데이터 무결성을 위해서 적정한 검사 및 기록하는 코드를 추가한다.
위에 나영한 원칙 및 가이드 말고도 배치를 사용하는 방법에 따라 주의해야 할 사항들이 더 있다.
하지만 단순한 구조의 배치를 사용한다면 위의 원칙과 가이드만으로도 충분히 잘 설계된 배치 프로젝트를 작성할 수 있을 것이다.