오늘 하루에 집중하자
  • [Spring Batch] 6. JobBuilderFactory, JobBuilder
    2024년 10월 30일 23시 18분 12초에 업로드 된 글입니다.
    작성자: nickhealthy

    기본 개념

    스프링 배치는 Job과 Step을 쉽게 생성 및 설정할 수 있도록 util 성경의 빌더 클래스들을 제공한다.

     

    JobBuilderFactory

    • JobBuilder를 생성하는 팩토리 클래스로서 `get(String name)` 메서드를 제공한다.
    • `jobBuilderFactory.get("jobName")`에서 jobName은 스프링 배치가 Job을 실행시킬 때 참조하는 Job의 이름이다.

     

    JobBuilder

    • Job을 구성하는 설정 조건에 따라 두 개의 하위 빌더 클래스를 생성하고, 실제 Job  생성을 위임한다.
    • SimpleJobBuilder
      • SimpleJob을 생성하는 Builder 클래스
      • Job 실행과 관련된 여러 설정 API를 제공한다.
    • FlowJobBuilder
      • FlowJob을 생성하는 Builder 클래스
      • 내부적으로 FlowBuilder를 반환함으로써 Flow 실행과 관련된 여러 설정 API를 제공한다.

     

    아키텍처

    Job을 정의할 때 어떤 API를 사용하느냐에 따라서 JobBuilder 클래스가 생성하는 하위 빌더 클래스가 다르다.

    Job의 구현체로는 크게 SimpleJobBuilder, FlowJobBuilder 클래스 2개가 있다.

    다음과 같이 3가지 경우로 Job을 정의했을 때 어떤 Builder 클래스를 사용하게 될 지 나뉘게 된다.

    1. `start()` 메서드의 인자를 Step 타입의 개체로 설정했을 때 즉, `start(step)`의 형식일 때 JobBuilder 클래스 내부적으로 SimpleJobBuilder 클래스가 생성된다. 그리고 SimpleJobBuilder는 SimpleJob을 생성한다.
    2. `start()` 메서드의 인자를 Flow 타입의 개체로 설정했을 때 즉, `start(flow)`의 형식일 때 JobBuilder 클래스 내부적으로 FlowJobBuilder 클래스가 생성된다. 그리고 FlowJobBuilder는 FlowJob을 생성한다.
    3. `flow()` 메서드의 인자를 Step 타입의 개체로 설정했을 때 즉, `flow(step)`의 형식일 때 JobBuilder 클래스 내부적으로 FlowJobBuilder 클래스가 생성된다. 그리고 FlowJobBuilder는 FlowJob을 생성한다.
    4. (FlowJobBuilder 클래스 오른쪽, 번호로 표시 못함) JobFlowBuilder 클래스가 있는데 FlowJobBuilder는 내부적으로 JobFlowBuilder 클래스를 가지고 있고, JobFlowBuilder가 Flow를 생성하게 된다.

     

    또한 네모 박스는 각각의 Builder 마다 사용할 수 있는 API가 다른데, 지금까지의 실습에서는 SimpleJobBuilder 클래스에서 `start(step)`, `next(step)` 이 두개만 사용해 왔었다.

     

    클래스 상속 구조

    JobBuilderFactory/JobBuilder의 클래스 상속 구조를 살펴보면서 어떻게 동작하는지 간단하게 알아보자

    JobBuilderFactory에서 JobBuilder 클래스를 생성하고 JobBuilde는 JobBuilderHelper를 상속하고 있다.

    또한 빨간 박스 안에 있는 CommonJobProperties는 Job을 생성할 때 필요한 공통 속성들을 모아놓은 클래스이다.

    SimpleJobRepository는 JobBuilder 내부에 참조하고 있으며, JobBuilder가 생성되는 시점에 JobRepository도 함께 생성된다.

    JobBuilder가 사용 API에 따라 SimpleJobBuilder, FlowJobBuilder를 생성 후 SimpleJob, FlowJob을 생성하게 된다면 JobRepository도 함께 전달되어 각각의 Job이 구동될 때 JobReposiroy를 통해서 CRUD 기능을 수행하게 된다.

     

     

    댓글