You will be fine

<Spring Batch> 0. 스프링 배치란?

by BFine
반응형

출처 : http://www.yes24.com/Product/Goods/99422216

 

스프링 배치 완벽 가이드 2/e - YES24

스프링 배치의 `Hello, World!`부터 최근 플랫폼의 발전에 따른 클라우드 네이티브 기술을 활용한 배치까지 폭넓은 스프링 배치 활용 방법과 이와 관련된 유용한 내용을 다룬다. 또한 스프링 프레임

www.yes24.com

 

가.  배치 (Batch-Processing)

 a. 무엇인가?

  -  실시간으로 동작하는 주 서비스 외에 별도로 대량의 데이터를 일괄처리 하는 것을 의미한다.

      => ex. 월말정산, 회원 상태 처리 등

 

 b. 특징

  -  사용자의 요청에 의해 동작하는 방식이 아니다. 

  -  주 서비스의 리소스를 소모하지 않고 별도로 동작한다.

  -  일괄로 데이터를 처리하기 때문에 관리하기가 용이하다.

 

 c. 설계시 고려사항

  1.  공통 컴포넌트를 쉽게 확장해 새로운 기능을 추가할 수 있는지

  2.  컴포넌트 변경 추가시 시스템 전체에 미치는 영향을 알 수 있도록 단위 테스트가 잘 되어있는지

  3.  Job이 실패할때 어디서 왜 실패했는지 알 수 있는지

 

나. Spring Batch

 a. 무엇인가? 

  -  액센츄어에서 만든 Spring을 사용하여 Batch Processing을 간편하게 할 수 있도록 만든 오픈소스 프레임워크

     => 사용 사례.  ETL [Extract (추출), Transform (변환), Load (적재)], 

 

 b.  구조

  -  3 Tier 계층 구조

#----- 어플리케이션 -----
#|                  |
#|   |    코어    |  |
#|   ------------   |
#|   | 인프라스트럭처|  |
#---------------------

  -  어플리케이션 레이어

       -  사용자 코드 및 구성(+Job 구조화)이 포함된다.  
       -  최상위 레이어가 아닌 감싸고 있음 => 보통은 코어와 함께 동작하지만 때로는 인프라 일부를 만들기도 한다.

  -  코어 레이어

       -  배치 도메인을 정의하는 모든 부분이 포함된다.

            => Job & Step 인터페이스,  실행에 사용되는 인터페이스 JobLauncher, JobParameters

  -  인프라스트럭처 레이어

       -  어떤 처리할 때 관련 리소스를 읽고 쓰기 및 Job 실패 후 재시도될 때 어떤 작업을 해야 하는지 등

 

 c. 아키텍처 

  -  스프링 배치에서 Job은 State machine에 지나지 않다. 일반적으로 상태를 보여주는 단위는 Step이다.

  -  Step은 Job을 구성하는 독립된 작업의 단위이며 두 가지 유형으로 나눌 수 있다.

        1. Tasklet(테스크릿) 기반

             => 간단한 구조, 초기화 & SP 실행, 알림전송 등과 같은 Job에서 사용
        2. Chunk(청크) 기반

             => 아이템을 기반으로 하는 처리방법이며 ItemReader, ItemProcessor(비필수), ItemWriter로 구성

  -  특징

        - 각 Step 서로 독립적으로 처리된다. 즉 다른 Step에 거의 영향을 미치지 않는다.

        - 하나의 Step 내에서 처리할 일을 여러 스레드로 나눠 병렬로 실행 가능하다.
        - 스프링 배치는 여러 빌더 클래스와 스프링빈을 통해 재사용이 용이하도록 설계되어있다. 

 

d. Job 컴포넌트 

  -  JobRepository
      -  배치 아키텍쳐 내에서 공유되는 주요 컴포넌트 
      -  다양한 배치 수행과 관련 수치 데이터(시작,종료 시간, 읽기/쓰기 횟수 등) & Job의 상태를 유지 관리한다. 

          => 일반적으로 RDB를 사용하여 관리

  -  JobLauncher
      - Job을 실행하는 역할을 담당(Job.excute)
      - 이외에는 재실행 여부 검토, 실행방법(스레스 처리), 파라미터 유효성 검증 등 수행한다.   

      - Spring Boot에서는 즉시 Job을 시작하는 기능을 제공 (일반적으로 직접 다룰 필요는 없음)
  -  동작

      1. Job을 실행하면 해당 Job은  각각의 Step을 실행한다. 

      2. Step이 실행되면 JobRepository는 현재 상태로 갱신된다.
          => 실행된 Step, 상태, 읽고 & 처리된 아이템 수 등 저장

      3. Step 내에서 Chunk 처리가 완료 될때 JobExecution or StepExecution을 현재상태로 갱신한다.

        - Job이 실행되면 JobInstance가 생기고 Job이름과 실행을 위해 제공되는 고유식별 파라미터를 가진다.
        - JobExecution은 실제 Job 실행을 의미한다. (Job 구동할 때마다 새롭게 생성)
             => 실행에 실패 후 재실행될 경우 JobInstance는 그대로이지만 JobExecution은 새롭게 생성 

        - StepExecution은 Step 실행을 의미하며 StepInstance는 존재하지 않는다

 

e. 병렬화 

  -  다중 스레드 Step
      - 스프링 배치에서 Job은 Chunk(블록 단위)로 처리되고 각각은 독립적인 트랜잭션으로 처리된다.

          => 일반적으로 Chunk는 연속해서 처리 (커밋수를 50개로 하면 50개씩 처리 후 커밋)
      - Step 내에 Chunk를 처리하는 부분에 여러 개의 스레드를 사용하면 병렬로 처리할 수 있다. 

  -  병렬 Step

      - Step을 병렬 스레드로 실행하는 방법이다.

  -  비동기 ItemProcessor, ItemWriter

      -  AsynchronousItemProcessorItemProcessor 호출 결과를 반환하는 대신 Future를 반환한다.
          반환된 Future 목록은 AsynchronousItemWriter로 전달한다.

  -  Remote Chunking (원격 청킹)

      -  여러 JVM에 처리를 분산하는 방법, 위의 방법들은 모두 단일 JVM에서 실행되어 확장성에 한계가 있다.
      -  입력은 마스터 노드에서 표준 ItemReader를 사용해 이뤄지고 MQ 등을 이용하여 원격으로 워커 노드에

           ItemProcessor로 전송되어 처리 완료 후에는 다시 마스터로 보내거나 직접 기록하는 방식이다.

      -  단점은 네트워크 사용량이 많아져서 실제 처리에 비해 I/O 비용이 적은 시나리오에 적합하다.

   -  파티셔닝

       -   Step에 대해서 마스터-워커 방식을 사용하여 처리하는 방법이다.

       -   원격 청킹과 차이점은 마스터가 워커의 Step 수집을 위한 컨트롤러 역할만 하기 때문에  MQ 등 별도 통신이 필요하지 않는다. 

 

다.  기본 설정

@Slf4j
@EnableBatchProcessing
@RequiredArgsConstructor
@Configuration
public class BatchExample {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Step step(){
      return stepBuilderFactory.get("Step")
       .tasklet(new Tasklet() {
            @Override
             public RepeatStatus execute(StepContribution contribution, 
                                ChunkContext chunkContext) throws Exception {
                  log.info(" ##### Step 실행 ##### ");
                  return RepeatStatus.FINISHED;
            }
         }).build();
    }

    @Bean
    public Job job(){
        return jobBuilderFactory.get("Job").start(step()).build();
    }
}

 

 a.  @EnableBatchProcessing

  -   스프링 배치의 인프라스트럭처를 부트스트랩 하는데 사용한다.

 

 b. SimpleBatchConfiguration 

  -  배치의 인프라스트럭처를 위한 Bean을 등록하는 클래스 이다. (AbstractBatchConfiguration 상속)

  -  Bean

       1. JobRepository :  실행 중인 Job의 상태를 기록함

       2. JobLauncher : Job을 실행시키는데 사용함

       3. JobRegistry : 특정한 Launcher 구현체를 사용할때 Job을 찾는 용도로 사용함

       4. JobExplorer : JobRepository를 사용해 읽기 전용 작업을 수행함

       5. PlatformTransactionManager : Job 진행 과정에서 트랜잭션을 다루는데 사용됨

       6. JobBuilderFactory & StepBuilderFactory : Job, Step을 생성하는 빌더 (AbstractBatchConfiguration 등록)

반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기