-
SpringBatch) 스프링 배치 간단 정리Spring 2024. 3. 31. 13:32
인프런 강의를 듣고 어카운트 테드 (회사) 시간에 간단 스프링 배치로 정리해서 발표를 진행했는데, 해당 내용을 블로그에도 정리한다.
강의의 출처는 인프런에 있는 정수원 강사님의 스프링 배치다!
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98
Architecture
- Application
- 개발자가 만든 모든 배치 Job 과 커스텀 코드
- Batch core
- Job을 실행, 모니터링, 관리하는 API로 구성
- Batch Infrastructure
- Job을 실행, 모니터링, 관리하는 API로 구성
- Application, Core 모두 공통 Infrastructure 위에서 빌드
스프링배치 활성화
@EnableBatchProcessing
- 스프링 배치가 작동하기 위해 선언해야 하는 어노테이션
- 총 4개의 설정 클래스를 실행시키며 스프링 배치의 모든 초기화 및 실행 구성을 이룸
- 스프링 부트 배치의 자동 설정 클래스가 실행되어 빈으로 등록된 모든 Job을 검색하여 초기화와 동시에 Job을 수행하도록 구성됨
스프링 배치 초기화 설정 클래스
1) SimpleBatchConfiguration
- JobBuilderFactory와 StepBuilderFactory 생성
- 스프링 배치의 주요 구성 요소 프록시 객체로 생성
2) BatchConfigurerConfiguration
- BasicBatchConfigurer
- SimpleBatchConfiguration에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스
- 빈으로 의존성 주입 받아 주요 객체를 참조 사용 가능
- JpaBatchConfigurer
- Jpa관련 객체를 생성하는 설정 클래스
- 그 외에도 사용자 정의 BatchConfigurer 인터페이스를 구현해서 사용 가능
3) BatchAutoConfiguration
- 스프링 배치가 초기화 될 때 자동으로 실행되는 설정 클래스
- JobLauncherApplicationRunner 인터페이스 빈 생성 -> Job을 수행
스프링 배치 도메인
Job
- 기본 개념
- 하나의 배치 작업 자체
- Job Configuration 을 통해 생성되는 객체 단위
- 여러 Step 을 포함하고 있는 컨테이너로서 반드시 한개 이상의 Step으로 구성
- 기본 구현체
- SimpleJob
- 순차적으로 Step 을 실행
- FlowJob
- 특정한 조건과 흐름에 따라 Step 을 구성하여 실행시키는 Job
- SimpleJob
JobInstance
- 기본 개념
- Job 의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행
- 처음 시작하는 Job + JobParameter 일 경우 새로운 JobInstance 생성
- 이전과 동일한 Job + JobParameter 으로 실행 할 경우 이미 존재하는 JobInstance 리턴
- Job 과는 1:M 관계
JobParameter
- 기본 개념
- Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체
- JobParameters와 JobInstance는 1:1 관계
- 이전과 동일한 Job + JobParameter 으로 실행 할 경우 이미 존재하는 JobInstance 리턴
- Job 과는 1:M 관계
- 생성 및 바인딩
- 어플리케이션 실행 시 주입
- 코드로 생성
- @JobScope, @StepScope 선언 후 value로 획득
JobExecution
- 기본 개념
- Job 실행 중에 발생한 정보들을 저장
- 시작시간, 종료시간 ,상태(시작됨,완료,실패),종료상태의 속성을 가짐
- JobExecution 의 실행 상태 결과가 'COMPLETED’ 면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가
- JobExecution 의 실행 상태 결과가 'FAILED’ 면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능
Step
- 기본 개념
- job을 구성하는 독립적인 하나의 단계
- Job 의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체
- 기본 구현체
- TaskletStep : Tasklet 타입의 구현체 제어
- PartitionStep : 멀티 스레드 방식으로 Step을 여러개로 분리해서 실행
- JobStep : Step 내에서 Job 을 실행
- FlowStep : Step 내에서 Flow 를 실행
StepExecution
- 기본 개념
- Step 실행 중에 발생한 정보들을 저장하고 있는 객체
- 시작시간, 종료시간 ,상태(시작됨,완료,실패), commit count, rollback count 등의 속성
- Job 이 재시작 하더라도 이미 성공적으로 완료된 Step 은 재 실행되지 않고 실패한 Step 만 실행되며 이전 단계 Step이 실패해서 현재 Step을 실행하지 않았다면 StepExecution을 생성하지 않음 ( Step이 실제로 시작됐을 때만 StepExecution을 생성)
- JobExecution 과의 관계
- Step의 StepExecution 이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료
- Step의 StepExecution 중 하나라도 실패하면 JobExecution 은 실패
ExecutionContext
- 기본 개념
- StepExecution 또는 JobExecution 객체의 상태(state)를 저장하는 공유 객체
- 공유 범위
- Step 범위 – 각 Step 의 StepExecution 에 저장되며 Step 간 서로 공유 안됨
- Job 범위 – 각 Job의 JobExecution 에 저장되며 Job 간 서로 공유 안되며 해당 Job의 Step 간 서로 공유
- ConcurrentHashMap 구조로 키/값 컬렉션
JobRepository
- 기본 개념
- 배치 작업 중의 정보를 저장하는 저장소 역할
- 배치 작업의 수행과 관련된 모든 meta data 를 저장
JobLauncher
- 기본 개념
- 배치 Job 을 실행시키는 역할
- JobLanucher.run(Job, JobParameters)
- Job과 Job Parameters를 인자로 받으며 요청된 배치 작업을 수행한 후 최종 client 에게 JobExecution을 반환
- 동기적 실행 (기본값)
- taskExecutor 를 SyncTaskExecutor 로 설정
- 비 동기적 실행
- taskExecutor 가 SimpleAsyncTaskExecutor 로 설정
- 동기적 실행 (기본값)
- 배치 Job 을 실행시키는 역할
스프링 배치 청크 프로세스
ChunkOrientedTasklet
- 기본 개념
- ItemReader, ItemWriter, ItemProcessor 를 사용해 Chunk 기반의 데이터 입출력 처리를 담당
- TaskletStep 에 의해서 반복적으로 실행되며 ChunkOrientedTasklet 이 실행 될 때마다 매번 새로운 트랜잭션이 생성되어 처리
- exception이 발생할 경우, 해당 Chunk는 롤백 되며 이전에 커밋한 Chunk는 완료된 상태가 유지
ChunkProvider
- 기본 개념
- ItemReader 를 사용해서 소스로부터 아이템을 Chunk size 만큼 읽어서 Chunk 단위로 만들어 제공
- 외부로 부터 ChunkProvider 가 호출될 때마다 항상 새로운 Chunk 가 생성
- Chunk size 만큼 item 을 읽으면 반복문 종료되고 ChunkProcessor 로 넘어감
- ItemReader 가 읽은 item 이 null 일 경우 반복문 종료 및 해당 Step 반복문까지 종료
- 구성
- SimpleChunkProvider
- FaultTolerantChunkProvider
ChunkProcessor
- 기본 개념
- ItemProcessor 를 사용해서 Item 을 변형, 가공, 필터링하고 ItemWriter 를 사용해서 Chunk 데이터를 저장, 출력
- 외부로 부터 ChunkProcessor 가 호출될 때마다 항상 새로운 Chunk 가 생성
- ItemProcessor 처리가 완료되면 Chunk<O> 에 있는 List<Item> 을 ItemWriter 에게 전달
- ItemWriter 처리가 완료되면 Chunk 트랜잭션이 종료하게 되고 Step 반복문에서 ChunkOrientedTasklet 가 새롭게 실행
- ItemWriter 는 Chunk size 만큼 데이터를 Commit 처리 하기 때문에 Chunk size 는 곧 Commit Interval
- 구성
- SimpleChunkProcessor
- FaultTolerantChunkProcessor
ItemReader
- 기본 개념
- 다양한 입력으로부터 데이터를 읽어서 제공하는 인터페이스
- Custom Reader - 구현 시 멀티 스레드 환경에서 스레드에 안전하게 구현할 필요
- 스레드에 안전한 JdbPaginItemReader, JpaPagingItemReader를 제외하고 하위 클래스들은 기본적으로 스레드에 안전하지 않기 때문에 병렬 처리시 데이터 정합성을 위한 동기화 처리 필요
ItemProcessor
- 기본 개념
- 데이터를 출력하기 전에 데이터를 가공, 변형, 필터링 (비즈니스 로직을 구현)
- ChunkOrientedTasklet 실행 시 선택적 요소
ItemWriter
- 기본 개념
- Chunk 단위로 데이터를 받아 일괄 출력 작업 처리
- 아이템 하나가 아닌 아이템 리스트를 전달 받음
- 출력이 완료되고 트랜잭션이 종료되면 새로운 Chunk 단위 프로세스로 이동
- ChunkOrientedTasklet 실행 시 필수적 요소로 설정
스프링 배치 멀티 프로세스
AsyncItemProcessor / AsyncItemWriter
- 기본 개념
- Step 안에서 ItemProcessor 가 비동기적으로 동작
- Writer는 비동기 실행 결과값을 모두 받을때까지 대기
- AsyncItemProcessor 와 AsyncItemWriter 가 함께 구성
- spring-batch-integration 의존성이 필요
- Step 안에서 ItemProcessor 가 비동기적으로 동작
Multi-threaded step
- 기본 개념
- Step 내에서 멀티 스레드로 Chunk 기반 처리
- TaskExecutorRepeatTemplate 이 반복자로 사용되며 설정한 개수 (throttleLimit) 만큼의 스레드를 생성
- ItemReader는 동기화가 보장되어야함
- 스레드마다 새로운 Chunk 가 할당되어 데이터 동기화가 보장
- 스레드마다 chunk를 공유하지 않음
Parallel Steps
- 기본 개념
- SplitState 를 사용해서 여러 개의 Flow 들을 병렬적으로 실행
- 실행 모두 완료된 후 FlowExecutionStatus 결과들을 취합해서 다음 단계 결정
Partitioning
- 기본 개념
- MasterStep 이 SlaveStep 을 실행시키는 구조
- MasterStep
- PartitionStep
- SlaveStep
- 각 스레드에 의해 독립적으로 실행
- 독립적인 StepExecution 파라미터 환경
- ItemReader / ItemProcessor / ItemWriter 등을 가지고 동작하며 작업을 독립적으로 병렬 처리
반복 / 오류 제어 / 리스너
Repeat
- 기본 개념
- 얼마나 작업을 반복해야 하는지 알려 줄수 있는 기능을 제공
- Step 의 반복과 Chunk 반복을 RepeatOperation 을 사용해서 처리
- 기본 구현체로 RepeatTemplate 를 제공
- 반복 종료 결정 항목
- RepeatStatus: 스프링 배치의 처리가 끝났는지 판별
- CONTINUABLE
- FINISHED
- CompletionPolicy
- 실행 횟수 또는 완료시기, 오류 발생시 수행 할 작업에 대한 반복여부 결정 및 정상 종료를 알리는데 사용
- ExceptionHandler
- RepeatCallback 안에서 예외가 발생하면 RepeatTemplate 가 ExceptionHandler 를 참조해서 예외 발생 여부 결정
- 비정상 종료를 알리는데 사용
- RepeatStatus: 스프링 배치의 처리가 끝났는지 판별
FaultTolerant (skip, retry)
- 기본 개념
- Job 실행 중에 오류가 발생해도 Step 이 즉시 종료되지 않고 Retry 혹은 Skip 하도록 처리
- Skip
- 데이터를 처리하는 동안 설정된 Exception이 발생했을 경우, 해당 데이터 처리를 건너뛰는 기능
- SkipPolicy 를 통해서 구현
- ItemReader / ItemProcessor / ItemWriter 에 적용 가능
- Retry
- ItemProcess, ItemWriter 에서 설정된 Exception이 발생했을 경우, 지정한 정책에 따라 데이터 처리를 재시도하는 기능
- ItemProcessor / ItemWriter 에 적용 가능
(참고 ✨)
https://hanseom.tistory.com/209#google_vignette
https://jojoldu.tistory.com/550
'Spring' 카테고리의 다른 글
SpringBatch) 스프링 배치 5의 변경점 (1) 2024.03.31 Spring에서 HttpServletRequest의 반복적 읽기 (feat. Filter에서는 request 교체가 가능한 이유) (0) 2023.08.22 Transaction Propagation과 예외 전파 (0) 2023.02.12 [AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 3) CD 구현하기 ② (Sonarqube 설치 및 연동) (0) 2022.09.17 [AWS + JENKINS + SONARQUBE] Spring 프로젝트 CI/CD 구현하기 2) CD 구현하기 ① (Jenkins 배포) (0) 2022.09.17 - Application