반응형
Job
- 배치 계층 구조에서 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미한다.
- 'A 데이터베이스의 데이터를 B 데이터베이스로 옮기는 배치'는 Job 자체를 의미한다.
- JobConfiguration을 통해 생성되는 객체 단위, 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으로 설정하고 명세해 놓은 객체
- 배치 Job을 구성하기 위한 최상위 인터페이스이며 스프링 배치가 기본 구현체를 제공한다. ex SimpleJob, FlowJob
- 여러 Step을 포함하고 있는 컨테이너로서 반드시 한 개 이상의 Step으로 구성해야 한다.
JobInstance
- Job이 실행될 때 생성되는 Job의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타낸다.
- Job의 설정과 구성은 동일하지만 Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job의 실행을 구분해야한다.
- 하루에 몇 번씩 배치 Job이 실행된다면 실행되는 각각의 Job을 JobInstance로 표현한다.
- Job과는 1:M 관계
- JobName과 JobKey가 동일한 데이터는 중복해서 저장할 수 없다.
JobInstance 생성 및 실행
- 처음 시작하는 Job + JobParameter일 경우 새로운 JobInstance 생성
- 이전과 동일한 Job + JobParameter으로 실행할 경우 이미 존재하는 JobInstance 리턴
- 내부적으로 Job + JobKey(JobParameter의 해시값을)을 가지고 JobInstance를 얻는다.
JobParameter
- Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체
- 하나의 Job에 존재할 수 있는 여러 개의 JOBInstance를 구분하기 위한 용도
- JobParameters와 JobInstance는 1:1 관계
- JobExecution과 1:M 관계
JobExecution
- JobInstance에 대한 한번의 시도를 의미하는 객체로서 Job 실행 중에 발생한 정보들을 저장하고 있는 객체
JobInstance과의 관계
- JobExecution은 FAILED 또는 COMPLETED 등의 Job의 실행 결과 상태를 가지고 있다.
- JobExecution은 실행 상태 결과가 COMPLETED면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가능하다.
- JobExecution은 실행 상태 결과가 FAILED면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능하다.
- JobParameter가 동일한 값으로 Job을 실행할지라도 JobInstance를 계속 실행할 수 있다.
- JobExecution의 실행 상태 결과가 COMPLETED가 될 때까지 하나의 JobInstance 내에서 여러 번의 시도가 생길 수 있다.
- JobInstance와 JobExecution는 1:M의 관계로서 JobInstance에 대한 성공/실패의 내역을 가지고 있다.
Step
- Batch Job을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는데 필요한 모든 정보를 가지고 있는 도메인 객체
- 단순한 단일 태스크 뿐 아니라 입력과 처리 그리고 출력과 관려된 복잡한 비즈니스 로직을 포함하는 모든 설정들을 담고 있다.
- 배치작업을 어떻게 구성하고 실행할 것인지 Job의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체
- 모든 Job은 하나 이상의 Step으로 구성
- 기본 구현체로는 TaskletStep, PartitionStep, JobStep, FlowStep 등이 있다.
StepExecution
- Step에 대한 한번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체
- Step이 매번 시도될 때 마다 생성되며 각 Step 별로 생성된다.
- Job이 재시작 하더라도 이미 성공적으로 완료된 Step은 재실행되지 않고 실패한 Step만 실행된다.
- 이전 단계 Step이 실패해서 현재 Step을 실행하지 않았다면 StepExecution을 생성하지 않는다. Step이 실제로 시작됐을 때만 StepExecution을 생성한다.
JobExecution과의 관계
- Step의 StepExecution이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료된다.
- Step의 StepExecution 중 하나라도 실패하면 JobExecution은 실패한다.
- JobExecution와 StepExecution은 1:M 관계
- 하나의 Job에 여러 개의 Step으로 구성했을 경우 각 StepExecution은 하나의 JobExecution을 부모로 가진다.
StepContribution
- 청크 프로세스의 변경 사항을 버퍼링한 후 StepExecution 상태를 업데이트하는 도메인 객체
- 청크 커밋 직전에 StepExecution의 apply 메서드를 호출하여 상태를 업데이트한다.
- ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 적용할 수 있다.
ExecutionContext
- 프레임워크에서 유지 및 관리하는 키/값으로 된 컬렉션으로 StepExecution 또는 JobExecution 상태를 저장하는 공유 객체
- DB에 직렬화 한 값으로 저장된다. - { "key" : "value" }
- Job 재시작시 이미 처리한 Row 데이터는 건너뛰고 이후로 수행하도록 하 때 상태 정보를 활용한다.
공유 범위
- Step 범위 - 각 Step의 StepExecution에 저장되며 Step간 서로 공유 안됨
- Job 범위 - 각 Job의 JobExecution에 저장되며 Job 간 서로 공유 안되며 해당 Job의 Step 간 서로 공유된다.
JobRepository
- 배치 작업 중의 정보를 저장하는 저장소 역할
- Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 메타 데이터를 저장함
- JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리한다.
- @EnableBatchProcessing 애노테이션만 선언하면 JobRepository가 자동으로 빈으로 등록된다.
JobLauncher
- 배치 Job을 실행시키는 역할을 한다.
- Job과 Job Parameters를 인자를 받으며 요청된 배치 작업을 수행한 후 최종 client에게 JobExecution을 반환함
- 스프링 부트 배치가 구동이 되면 JobLauncher 빈이 자동 생성 된다.
Job 실행
- JobLauncher.run(Job, JobParameters)
- 스프링 부트 배치에서는 JobLauncherApplicationRunner가 자동적으로 JobLauncher를 실행시킨다.
- 동기적 실행
- taskExecutor를 SyncTaskExecutor로 설정할 경우 -> 이게 기본 값
- JobExecution을 획득하고 배치 처리를 최종 완료한 이후 Client에게 JobExecution을 반환
- 스케줄러에 의한 배치처리에 적합함 -> 배치처리시간이 길어도 상관 없는 경우
- 비동기적 실행
- taskExecutor가 SimpleAsyncTaskExecutor로 설정한 경우
- JobExecution을 획득한 후 Client에게 바로 JobExecution을 반환하고 배치처리를 완료한다.
- HTTP 요청에 의한 배치처리에 적합함 -> 배치처리 시간이 길 경우 응답이 늦어지지 않도록 한다.
이상으로 포스팅을 마칩니다. 감사합니다.
참고 자료
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard
반응형
댓글