본문 바로가기
WEB/SPRING

스프링 배치

by snow_white 2023. 5. 14.

스프링 배치란?

  • 일상적인 배치 처리 + 엔터프라이즈급의 시스템 처리
  • 자바의 장점 + 스프링 프레임워크의 장점 = 모두 갖춘 배치 프레임워크
  • 배치 처리에 대한 표준 인터페이스(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

  • 간단한 실행 처리
  • 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

댓글