스프링 배치란?
- 일상적인 배치 처리 + 엔터프라이즈급의 시스템 처리
- 자바의 장점 + 스프링 프레임워크의 장점 = 모두 갖춘 배치 프레임워크
- 배치 처리에 대한 표준 인터페이스(JSR-352) 구현
- 대규모 온라인 커뮤니티
- 이미 실무에서 안정적으로 사용되고 발전해 온 이력
스프링 배치의 지원 기능
- 트랜잭션 관리
- 청크 단위의 처리
- 선언적 입출력 지원
- 병령처리
- 시작, 중지, 재시작 지원
- 재시도 또는 건너뛰기 지원
- 웹기반 관리 인터페이스 제공 (Spring Cloud Data Flow)
스프링 배치의 실무 사용 사례
- 배달 상점의 메뉴 등록 및 수정
- 프랜차이즈의 메뉴 및 가격 업데이트
- 회원 포인트 적립
- 쿠폰 발급
- ETL (추출, 변환, 적재)
- 데이터 마이그레이션
- 검색 인덱싱
- 상품 관리
스프링 배치의 기술적 특징
- 개발자는 스프링 프로그래밍 모델을 그대로 배치 프로그램 개발에 사용
- 인프라, 배치 실행 환경, 배치 어플리케이션의 명확한 분리
- Jar 형태의 간단한 배포 모델 제공
- 스케줄링 하는 기능은 제공하지 않는다.
- 다양한 스케줄링 도구와 연동 가능
- 모든 프로젝트에서 사용 가능한 배치 관련 인터페이스 제공
- 쉬운 구성, 설정, 그리고 사용자 지정과 확장
스프링 배치 아키텍처
- 3개의 티어로 구성된 아키텍처
- 어플리케이션, 코어, 인프라스트럭처
- 어플리케이션 - 코어와 상호 작용
- 개발자가 작성하는 모든 배치 작업 혹은 코드
- 코어 - 잡, 스텝, 잡 런처, 잡 파라미터 등의 배치 도메인 요소들
- 배치 작업을 시작하고 제어하는 요소
- 인프라스트럭처 - 배치 처리를 위해 필요한 공통 인프라 제공
- 어플리케이션 - 코어와 상호 작용
스프링 배치 - 도메인 언어
- 스프링 배치 어플리케이션을 작성하기 위해 필요한 요소
- Job
- JobInstance
- JobExecution
- JobParameter
- JobListener
- Step
- Tasklet 기반
- Chunk 기반
Job
- 스프링 빈 구성 - 유일하다.
- 외부 의존성 없이 독립성을 갖는다.
- 스프링 배치에서 실행되는 처리 단위
- 상호 작용없이 처음부터 끝까지 실행된다.
- 스텝을 담는 컨테이너 개념
- 하나 또는 여러 개의 스텝으로 구성
JobInstance
- Job의 논리적 실행 단위
- Job이 성공적으로 완료되면 다시 실행시킬 수 없다. ⇒ 중복 실행 방지
- Job 이름과 Job 파라미터로 구분된다.
- 동일한 Job 이름에 동일한 파라미터를 사용하여 단 한번만 실행
JobExecution
- Job을 실행한 것을 의미
- 실패든 성공이든 시도한 것을 나타낸다.
JobParameter
- Job에 전달되는 파라미터
JobListener
- Job 실행과 관련한 이벤트를 받을 수 있는 기능을 제공
public interface JobExecutionListener {
void beforeJob(JobExecution jobExecution); // Job이 실행되기 전
void afterJob(JobExecution jobExecution); // Job이 실행된 후
}
스프링 배치에서는 실행된 Job의 실행 상태에 따라서 이벤트가 발생한다.
이러한 이벤트를 받아서 처리하고 싶을 때 JobListener를 사용한다.
Step
- Job 을 구성하고 있는 배치 작업의 독립적이고 순차적인 단위
- 주요 유형
- Tasklet 기반 Step
- 간단한 실행 처리
- Chunk 기반 Step
- 아이템 기반의 처리
- ItemReader
- IteProcessor
- ItemWriter
- Tasklet 기반 Step
Tasklet
- 간단한 실행 처리
- execute 메서드
- 하나의 트랜잭션 단위로 동작
@FunctionalInterface
public interface Tasklet {
@Nullable
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
}
Tasklet 인터페이스를 상속 받은 execute() 메소드를 구현해야 한다.
데이터베이스 작업을 하는 경우에는 이 Tasklet이 하나의 트랜잭션 단위로 동작한다.
ItemReader, ItemProcessor, ItemWriter
- ItemReader
- 스텝에서 한 번에 한 항목씩 입력을 나타내는 추상화 인터페이스
- ItemProcessor
- 스텝에서 아이템에 대한 비지니스 처리를 나타내는 추상화 인터페이스
- ItemWriter
- 스텝에서 한 번에 하나의 배치 또는 묶음의 출력을 나타내는 추상화 인터페이스
스프링 배치의 잡 처리 흐름
스프링 배치에서 Job을 실행시키기 위해 Client에서 JobLauncher를 동작시킨다.
JobLauncher는 이름에 맞게 Job을 실행시킨다.
이때 JobInstance가 생성된다. 이 JobInstance는 내부적으로 Step과 함께 비즈니스(배치 업무)를 수행한다.
Job은 실행이 되면 최종적으로 성공(FINISHED) 또는 실패(FAILED)의 결과를 갖게 된다.
스프링 배치의 스텝 처리 흐름
- Step → ItemReader → ItemWriter
스텝의 유형은 크게 Tasklet 기반과 Chunk 기반이 있다.
스텝이 실행되면 먼저 입력 소스(ItemReader)로부터 아이템 하나를 읽게 된다. (read)
중간에 아이템을 처리하는 Processor는 생략이 가능하다. 만약 위 이미지처럼 아이템 처리 부분이 없다면 아이템을 특정 Chunk만큼 읽은 뒤에 바로 ItemWriter로 묶어서 전달하게 된다.
스프링 배치의 스텝 처리 흐름
- Step → ItemReader → ItemProcessor → ItemWriter
최초에 step이 실행되면 step에서 ItemReader가 실행되고, 실행되면서 아이템을 하나씩 읽어 들인다. 이 상태에서 읽어 들인 아이템을 아이템 처리기에서 하나씩 처리하게 된다.
이렇게 아이템 처리기까지 거치면 ItemWriter로 처리된 아이템들이 전달된다.
Step의 흐름
- 순서
- 스텝은 각 스텝과의 순서를 지정 가능
@Bean public Job job(JobRepository jobRepository) { return new JobRepository("job", jobRepository) .start(stepA()) .next(stepB)) .next(stepC)) .build(); }
- 분기
- Step은 스텝의 종료(ExitStatus)를 패턴 매칭하여 다른 스텝으로 분기 가능
- ***** matches zero or more characters -
- ? matches exactly one character
@Bean public Job job(JobRepository jobRepository) { return new JobBuildery("job", jobRepository) .start(stepA()) .on("*").to(stepB{}) // 다음 스텝으로 넘기기 .from(stepA()).on("FAILED").to(stepC()) // A로부터 이벤트 결과가 FAIL이면 C로 가라 .end() .build(); }
ItemReader
- 아이템 읽기와 관련된 전략 인터페이스
- 다양한 입력소스로부터 읽어들인다.
- Step에서 처리할 아이템 한 개를 반환
public interface ItemReader<T> {
T read() throws Exception, ..., NonTransientResourceException;
}
ItemReader의 종류
- FlatFileItemReader (예, csv 파일)
- StaxEventItemReader (예, xml 파일)
- JsonItemReader (예, json 파일)
- JdbcCursorItemReader (데이터베이스)
- JdbcPagingItemReader (데이터베이스)
- JpaPagingItemReader (데이터베이스)
- HibernateCursorItemReader (데이터베이스)
- StoredProcedureItemReader (데이터베이스)
ItemProcessor
- 입력 소스에서 읽은 아이템 기반으로 특정 작업을 수행
- 처리를 완료 후 결과 아이템을 반환
- 입력 아이템의 타입과 결과 아이템의 타입이 다를 수 있다.
- 여러 번 전달되더라도 동일 결과를 갖는 멱등성을 갖어야 한다.
public interface ItemProcessor<I, O> {
O process(I item) throws Exception;
}
ItemWriter
- 스프링 배치에서 출력을 담당하는 전략 인터페이스
- 아이템을 하나하나 쓰지 않고 묶어서 쓴다.
- Chunk 단위
- 아이템 리더와 다름. 혼동할 수 있음
public interface ItemWriter<T> { void write(Chunk<? extends T> items) throws Exception; }
ItemWriter 종류
- FlatFileItemWriter
- StaxEventItemWriter
- JsonFileItemWriter
- JdpcBatchItemWriter
- HibernateItemWriter
- JpaItemWriter
'WEB > SPRING' 카테고리의 다른 글
배치 서비스 (0) | 2023.05.10 |
---|---|
Springboot properties 파일 분리 (local, prod, ...) (0) | 2023.03.17 |
Springboot에서 java-email 활용하기 (0) | 2022.11.21 |
[Spring] AOP 프로그래밍 (0) | 2022.06.03 |
[Spring] 빈(Bean) 🟢 (0) | 2022.06.03 |
댓글