ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

     

    스프링 배치 | 정수원 - 인프런

    정수원 | 초급에서 중~고급에 이르기까지 스프링 배치의 기본 개념부터 API 사용법과 내부 아키텍처 구조를 심도있게 다룹니다. 그리고 스프링 배치 각 기능의 흐름과 원리를 학습하게 되고 이를

    www.inflearn.com

     

     

     

     

    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

     

     

    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을 반환
        • 동기적 실행 (기본값)
          1. taskExecutor 를 SyncTaskExecutor 로 설정
        • 비 동기적 실행
          • taskExecutor 가 SimpleAsyncTaskExecutor 로 설정

     

     

     

     

     

    스프링 배치 청크 프로세스 

    출처 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

    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 반복문까지 종료
      • 구성
        1. SimpleChunkProvider
        2. 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
      • 구성
        1. SimpleChunkProcessor
        2. FaultTolerantChunkProcessor

     

     

    ItemReader

    • 기본 개념
      • 다양한 입력으로부터 데이터를 읽어서 제공하는 인터페이스
      • Custom Reader - 구현 시 멀티 스레드 환경에서 스레드에 안전하게 구현할 필요
      • 스레드에 안전한 JdbPaginItemReader, JpaPagingItemReader를 제외하고 하위 클래스들은 기본적으로 스레드에 안전하지 않기 때문에 병렬 처리시 데이터 정합성을 위한 동기화 처리 필요


    ItemProcessor

    • 기본 개념
      • 데이터를 출력하기 전에 데이터를 가공, 변형, 필터링 (비즈니스 로직을 구현)
      • ChunkOrientedTasklet 실행 시 선택적 요소

    ItemWriter

    • 기본 개념
      • Chunk 단위로 데이터를 받아 일괄 출력 작업 처리 
      • 아이템 하나가 아닌 아이템 리스트를 전달 받음
      • 출력이 완료되고 트랜잭션이 종료되면 새로운 Chunk 단위 프로세스로 이동
      • ChunkOrientedTasklet 실행 시 필수적 요소로 설정

     

     

     

     

    스프링 배치 멀티 프로세스

     

    AsyncItemProcessor / AsyncItemWriter

    출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

    • 기본 개념
      • Step 안에서 ItemProcessor 가 비동기적으로 동작
        • Writer는 비동기 실행 결과값을 모두 받을때까지 대기 
      • AsyncItemProcessor 와 AsyncItemWriter 가 함께 구성
        • spring-batch-integration 의존성이 필요

     

     

    Multi-threaded step

    출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

     

    • 기본 개념
      •  Step 내에서 멀티 스레드로 Chunk 기반 처리
      • TaskExecutorRepeatTemplate 이 반복자로 사용되며 설정한 개수 (throttleLimit) 만큼의 스레드를 생성
      • ItemReader는 동기화가 보장되어야함 
      • 스레드마다 새로운 Chunk 가 할당되어 데이터 동기화가 보장
        • 스레드마다 chunk를 공유하지 않음 

     

     

     

    Parallel Steps

    출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

    • 기본 개념
      • SplitState 를 사용해서 여러 개의 Flow 들을 병렬적으로 실행
      • 실행 모두 완료된 후 FlowExecutionStatus 결과들을 취합해서 다음 단계 결정

     

     

     

    Partitioning

    출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

    • 기본 개념
      • MasterStep 이 SlaveStep 을 실행시키는 구조
      • MasterStep
        • PartitionStep
      • SlaveStep
        1. 각 스레드에 의해 독립적으로 실행
        2. 독립적인 StepExecution 파라미터 환경
        3.  ItemReader / ItemProcessor / ItemWriter 등을 가지고 동작하며 작업을 독립적으로 병렬 처리

     

     

    반복 / 오류 제어 / 리스너 

     

    Repeat

    출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

    • 기본 개념
      •  얼마나 작업을 반복해야 하는지 알려 줄수 있는 기능을 제공
      •  Step 의 반복과 Chunk 반복을 RepeatOperation 을 사용해서 처리
      • 기본 구현체로 RepeatTemplate 를 제공
    • 반복  종료 결정  항목
      • RepeatStatus: 스프링 배치의 처리가 끝났는지 판별
        1. CONTINUABLE
        2. FINISHED
      • CompletionPolicy
        1. 실행 횟수 또는 완료시기, 오류 발생시 수행 할 작업에 대한 반복여부 결정 및 정상 종료를 알리는데 사용
      • ExceptionHandler
        1. RepeatCallback 안에서 예외가 발생하면 RepeatTemplate 가 ExceptionHandler 를 참조해서 예외 발생 여부 결정
        2. 비정상 종료를 알리는데 사용

     

     

     

     

     

    FaultTolerant (skip, retry)

    • 기본 개념
      •  Job 실행 중에 오류가 발생해도 Step 이 즉시 종료되지 않고 Retry 혹은 Skip 하도록 처리
    • Skip
      • 데이터를 처리하는 동안 설정된 Exception이 발생했을 경우, 해당 데이터 처리를 건너뛰는 기능
      • SkipPolicy 를 통해서 구현
      •  ItemReader / ItemProcessor / ItemWriter 에 적용 가능
    • Retry
      •  ItemProcess, ItemWriter 에서 설정된 Exception이 발생했을 경우, 지정한 정책에 따라 데이터 처리를 재시도하는 기능
      •  ItemProcessor / ItemWriter 에 적용 가능

     

     

     

    ItemReader의 예외처리&nbsp;출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

     

    ItemProcessor의 예외 처리&nbsp;출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

     

    ItemWriter의 예외처리&nbsp;출처&nbsp;https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98

     

     

     

     

     

     

    (참고 ✨)

    https://hanseom.tistory.com/209#google_vignette

     

    28. 멀티 스레드 프로세싱 (Multi Thread Processing)

    일반적으로 복잡한 처리나 대용량 데이터를 다루는 작업일 경우, 전체 소요 시간 및 성능상의 이점을 가져오기 위해 멀티 스레드 방식을 선택합니다. 멀티 스레드 처리 방식은 데이터 동기화 이

    hanseom.tistory.com

    https://jojoldu.tistory.com/550

     

    Spring Batch 파티셔닝 (Partitioning) 활용하기

    지난 시간에 소개 드린 멀티쓰레드 Step과 더불어 파티셔닝 (Partitioning)은 Spring Batch의 대표적인 Scalling 기능입니다. 서비스에 적재된 데이터가 적을 경우에는 Spring Batch의 기본 기능들만 사용해도

    jojoldu.tistory.com

     

Designed by Tistory.