배치 아키텍처



애플리케이션 레이어

  • 개발자가 개발한 코드를 나타냄
  • 대부분 코어 레이어와 상호 작용 함


코어 레이어

  • 배치 영역을 구성하는 실제적인 여러 컴포넌트로 이뤄짐


인프라스트럭처 레이어

  • ItemReader, ItemWriter 제공
  • 재시작과 관련된 문제를 해결할 수 있는 클래스와 인터페이스 제공


잡과 스텝



스텝

  • 스텝은 스프링 배치에서 가장 일반적으로 상태를 보여주는 단위
  • 각 스텝은 잡을 구성하는 독립된 작업의 단위
  • 스텝은 Tasklet 기반 스텝과 Chunk 기반의 스텝이라는 두 가지 유형이 있음


스텝을 분리함으로써 얻는 기능

  • 유연성
    • 재사용이 가능하게 구성할 수 있도록하는 여러 빌더 클래스를 제공함
  • 유지 보수성
    • 각 스텝은 이전, 다음 스텝과 독립적이므로 다른 스텝에 영향을 미치지 않음
    • 단위 테스트, 디버그, 변경에 용이하며 재사용 가능
  • 확장성
    • 하나의 스텝 내에서 처리할 일을 여러 스레드에 나눔으로써 해당 스텝의 코드를 병렬로 실행할 수 있음
  • 신뢰성
    • 다양한 오류 처리 방법을 제공함
    • 예외 발생 시 재시도 또는 건너뛰기(skip) 등의 동작이 가능함


잡 실행

  • 스프링 배치의 많은 컴포넌트가 잡의 실행에 서로 상호 작용함


Job Repository

  • 다양한 배치 수행과 관련된 수치 데이터(시작 시간, 종료 시간, 상태, 읽기/쓰기 횟수 등) 및 잡의 상태를 유지 관리 함
  • 일반적으로 관계형 데이터베이스를 사용하며 스프링 배치 내의 대부분의 주요 컴포넌트가 공유함


JobLauncher

  • 잡을 실행하는 역할을 담당
  • 잡의 재실행 가능여부 검증, 잡의 실행 방법, 파마리터 유효성 검증 등의 처리 수행


Job

  • 잡은 구성된 스텝 목록에 따라 각 스텝을 실행함
  • 스프링 배치는 JobRepository 내에 있는 JobExecution, StepExecution 에 상태를 갱신함


병렬화


잡을 병렬화하는 방법에는 다중 스레드 스텝을 통한 작업 분할, 전체 스텝의 병렬 실행, 비동기 ItemProcessor/ItemWriter 구성, 원격 청킹, 파티셔닝 이 있다.

다중 스레드 스텝

  • 스프링 배치에서 잡은 청크(chunk)라는 블록 단위로 처리되도록 구성됨
  • 각 청크는 독립적인 트랜잭션으로 처리 됨
  • 각 청크는 연속해서 처리 후 커밋하며 이 과정을 모든 레코드가 처리될 때 까지 반복함
    • 10,000 개의 레코드가 있을 때, 1 → 50 처리 후 커밋, 51 → 100 처리 후 커밋 의 반복
  • 스프링 배치를 사용하면 작업을 병렬로 실행해 성능을 향상 시킬 수 있음

  • 세 개의 스레드를 사용하도록 구성하면, 위 그림과 같이 처리량을 이론적으로 3배 늘릴 수 있음


병렬 스텝

  • 스텝 자체를 병렬로 실행하는 것


비동기 ItemProcessor/ItemWriter

  • 스탭 내의 ItemProcessor 에서 복잡한 계산이나 원격 서비스 호출 등을 할 때에 병목현상이 발생 할 수 있음
  • AsynchronousItemProcessor 는 ItemProcessor 호출 결과를 반환하는 대신, 각 호출에 대해 java.util.concurrent.Future 를 반환함
  • 반환된 Future 목록은 AsyncronousItemWriter 로 전달된 후 실제 결과를 얻어내어 이름 ItemWriter 에 전달함


원격 청킹

  • 처리의 일부분을 여러 JVM을 통해 수평으로 확장하는 방법임
  • 입력은 마스터 노드에서 표준 ItemReader 를 사용해 이뤄짐
  • 그 이후 지속 가능한 통신 형식(래빗 MQ 또는 액티브MQ 와 같은 메시지 브로커)을 통해 메시지 기반 POJO로 구성된 원격 워커 ItemProcessor 로 전송됨
  • 마스터에서 데이터를 읽고 원격 워커에서 처리한 다음 다시 마스터에게 전송하는 구조임
  • 네트워크 사용량이 매우 많아질 수 있음에 유의해야 함
  • 실제 처리에 비해 I/O 비용이 적은 시나리오에 적합함


파티셔닝


로컬 파티셔닝

  • 워커의 스레드 사용


원격 파티셔닝

  • 마스터 및 원격 워커를 사용
  • 마스터는 워커의 스텝 수집을 위한 컨트롤러 역할만 하게 됨
  • 각 워커의 스텝은 독립적으로 동작하며 마치 로컬로 배포된 것처럼 동일하게 구성됨
  • 모든 워커가 각각 맡은 일을 완료하면 마스터 스텝이 완료된 것으로 간주됨
  • JobRepository가 복제된 작업이 없고 모든 작업이 완료됐음을 보장하기 때문에 내구성 있는 지속적인 통신이 필요 없음


이 포스팅은 스프링 배치 완벽가이드 2/e 의 내용을 요약 정리한 것 입니다.