개념이 너무 크기에, 여기서는 간단한 용어들과 개념을 살펴봅니다.
사용법은 추후 포스팅에 작성합니다.
FlowJob
기본 개념
- FlowJobBuilder 을 사용하여 구성한다.
- Step 을 특정 조건에 따라 흐름을 전환할 수 있도록 구성이 가능하다.
- Step 이 실패하더라도, Job은 실패하지 않도록 구성
- A, B, C 스탭이 있을 때, A 스탭의 성공/실패 여부에 따라 B 또는 C 스탭으로 분기가 필요할 때
- 특정 Step은 실행되지 않게 구성 해야 하는 경우
- Flow 와 Job 의 흐름을 구성하는데만 관여하고 실제 비즈니스 로직은 Step 에서 이루어진다.
- 내부적으로 SimpleFlow 객체를 포함하고 있으며 Job 실행 시 호출한다.

생성 방법
- JobBuilderFactory 를 통해 생성한다.
- jobBuilderFactory.get("jobName") 을 통해 JobBuilder 를 생성하고,
.start(Flow) 메소드를 통해 FlowJobBuilder 를 생성하여 FlowJob 을 구성할 수 있다.
구성 요소
- Flow : Flow 를 정의한다. (start, from, next 메소드)
- Transition : 조건에 따라 흐름을 전환한다. (to, stop, fail, end, stopAndRestart 메소드)

동작 방식

SimpleFlow
기본 개념
- 스프링 배치에서 제공하는 Flow 의 구현체
- FlowBuilder 를 사용해서 생성한다.
- State 를 실행시킨다.
- Transition 과 조합하여 여러 개의 Flow 및 중첩 Flow 를 만들어 Job 을 구성할 수 있다
State
- Step, Flow, JobExecutionDecider 를 감싸고 있는 객체.
- Flow 를 구성하면, 내부적으로 알아서 생성되고, Transition 과 연동된다.
- handle() 메소드를 통해 State를 실행하고, 모든 step이 동작되도록 한다.
- 마지막 실행 상태가 FlowJob 의 최종 상태가 된다.

- SimpleFlow 는 stateMap 에 있는 모든 state 들을 handle 메소드를 통해 실행되도록 한다.
- SimpleFlow 는 현재 실행되는 State 가 어떤 타입인지 알지 못한다. 단순히 handle 메소드만 실행하고, FlowExecutionStatus 를 반환받는다. => 상태 패턴
동작 방식

- flow.execute(FlowExecutor) 를 통해 SimpleFlow 를 실행한다.
- SimpleFlow 는 내부적으로 가지고 있는 StateMap 을 가지고 각 State를 실행한다.
- 이 StateMap 은 초기화 시점에 StateTransition 객체로부터 State 객체 정보를 참조해서 매핑된다.
- 최초에는 flow.start(FlowExecutor) 로 실행한다.
- state.handle(FlowExecutor) 를 통해 State 를 실행한다.
- simpleFlow.nextStatus(StateName, FlowExecutionStatus, StepExecution) 을 통해 다음에 실행할 State 를 선정한다.
- 여기서 Transition 를 참조하여 흐름을 결정한다.
- flow.resume(StateName, FlowExecutor) 를 통해 다음 State 를 Loop 로 반복하면서 처리한다.
FlowStep
기본 개념
- Step 내에 Flow 를 할당하여 실행시키는 도메인 객체
- flowStep 의 BatchStatus 와 ExitStatus 은 Flow 의 최종 상태값에 따라 결정된다
Transition
기본 개념
- Flow 에 속한 Step 의 조건부 실행을 설정한다.
- Job 의 API 설정을 통해 설정한다. (on 메소드를 통해 Transition Flow를 구성)
- Step 의 ExitStatus가 어떤 pattern 과도 매칭되지 않으면 예외가 발생되며 Job이 실패 처리된다.
- 구체적인 것부터 그렇지 않은 순서로 적용된다.