Skip to the content.

참조:https://deeplify.dev/back-end/spring/batch-tutorial

스프링 배치(Spring Batch)

배치 프로세싱은 일괄처리하는 뜻을 가지고 있다.

일괄처리의 의미는 일련의 작업을 정해진 로직으로 수행하는 것이라고 할 수 있다.

이런 일괄처리는 어떠한 경우에 필요할까?


  1. 대용량의 비즈니스 데이터를 복잡한 작업으로 처리해야하는 경우
  2. 특정한 시점에 스케쥴러를 통해 자동화된 작업이 필요한 경우(ex. 푸시알림,월별 리포트)
  3. 대용량 데이터의 포맷을 변경,유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야하는 경우

위와 같은 경우에 어플리케이션을 작성하여 처리하게된다.실제로 엔터프라이즈 환경에서는 정말 다양한 종류의 작업들을 배치를 이용하여 처리하고 있다.

스프링 팀은 위와 같은 요구사항을 처리해 줄 수 있는 배치와 관련된 어플리케이션 제작의 편의를 위해서 스프링 배치 프레임워크를 만들어 표준화하게 되었다.

배치의 일반적인 사용 시나리오

  1. 데이터베이스,파일 또는 큐에서 데이터 읽기
  2. 데이터를 정의한 방식으로 처리
  3. 처리된 데이터를 데이터 쓰기

스프링 배치는 위와 같은 방식으로 사용자와 상호작용 없이 반복적으로 데이터를 트랜잭션 단위로 처리할 수 있도록 구현되어 있고,개발자는 데이터 처리에 대한 비즈니스 로직에만 집중하여 배치 프로세스를 작성할 수 있다.

스프링 배치가 제공할 수 있는 비즈니스 시나리오

  1. 주기적인 배치 프로세스
  2. 동시적인 배치 프로세스:작업의 병렬 처리
  3. 단계별 엔터프라이즈 메시지 기반 처리
  4. 대규모 작업에 대한 병렬 배치 프로세스
  5. 실패 후 수동 또는 예약 된 재시작
  6. 단계별 순차 처리
  7. 부분 처리:레코드 건너 뛰기(예: 롤백 시)
  8. 배치 작업 처리의 단위가 작은 경우, 기존 저장 프로시저/스트립트가 있는 경우 전체 배치에 대한 트랜잭션 처리

스프링 배치 프레임워크는 위와 같이 다양한 비즈니스 시나리오를 처리할 수 있도록 설계되어 있다.

스프링 배치 계층 구조

스프링 배치 프레임워크는 확장성과 최종사용자를 염두해두고 설계되었기 때문에

위와 같이 Application,Batch Core 그리고 Batch Infrastructure로 설계되었다.

Application:개발자가 작성한 모든 배치 작업과 사용자 정의 코드 포함

Batch Core:배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스 포함

Batch Infrastructure:개발자와 어플리케이션에서 사용하는 일반적인 Reader와 Writer 그리고 RetryTemplate와 같은 서비스 포함

스프링 배치는 계층 구조가 위와 같이 설계되어 있기 때문에 개발자는 Application 계층의 비즈니스 로직에 집중할 수 있고 배치의 동작과 관련된 것은 Batch Core에 있는 클래스들을 이용하여 제어할 수 있다.

배치 원칙 및 가이드

  1. 일반적으로 같은 서비스 환경에서 동작하는 서비스와 배치는 서로에게 영향을 미칠 수 있기 때문에 배치와 서비스에 영향을 최소화 할 수 있도록 구조와 환경에 맞게 디자인해야 한다.
  2. 배치 어플리케이션 내에서 가능한한 복잡한 로직은 피하고 단순하게 설계해야 한다.
  3. 데이터 처리하는 곳과 데이터의 저장소는 물리적으로 가능한한 가까운 곳에 위치하도록 한다.
  4. 데이터베이스 I/O,네트워크 I/O,파일 I/O 등의 시스템 리소스의 사용을 최소화 하고 최대한 많은 데이터를 메모리 위에서 처리하도록 한다.
  5. 처리 시간이 많이 걸리는 작업을 시작하기 전에 메모리 재할당에 소모되는 시간을 피하기 위해 충분한 메모리를 할당한다.
  6. 데이터 무결성을 위해서 적정한 검사 및 기록하는 코드를 추가한다.

위에 나영한 원칙 및 가이드 말고도 배치를 사용하는 방법에 따라 주의해야 할 사항들이 더 있다.

하지만 단순한 구조의 배치를 사용한다면 위의 원칙과 가이드만으로도 충분히 잘 설계된 배치 프로젝트를 작성할 수 있을 것이다.