반응형
스프링 배치 구조
스프링 배치는 백엔드의 배치처리 기능을 구현하는데 사용하는 프레임워크이다.
배치의 일반적인 시나리오는 다음과 같은 3단계로 이루어집니다.
- 읽기(Read) : DB에서 특정 데이터 레코드를 읽는다.
- 처리(Processing) : 원하는 방식으로 데이터 가공/처리 합니다.
- 쓰기(Write) : 수정된 데이터를 다시 저장소(DB)에 저장합니다.
배치 처리
- job과 step은 1:M
- Step과 itemReader, itemProcessor, itemWirter 1:1 관계이다.
- Job이라는 하나의 큰 일감(Job)에 여러 단계 (Step)을 두고, 각 단계를 배치의 기본 흐름대로 구성합니다.
Job
- Job은 배치 처리 과정을 하나의 단위로 만들어 표현한 객체입니다. 또한 전체 배치 처리에 있어 항상 최상단 계층에 있습니다.
- 위에서 하나의 Job(일감) 안에는 여러 Step(단계)이 있다고 설명했던 바와 같이 스프링 배치에서 Job 객체는 여러 Step 인스턴스를 포함하는 컨테이너 입니다.
- Job 객체를 만드는 빌더는 여러 개 있습니다. 여러 빌더를 통합하여 처리하는 공장인 JobBuilderFactory로 원하는 Job을 쉽게 만들수 있습니다.
public SimpleJobBuilder start(Step step){
/* (1) Step을 추가해서 가장 기본이 되는 SimpleJobBuilder를 생성합니다. */
return new SimpleJobBuilder(this).start(step);
}
public JobFlowBuilder start(Flow flow){
/* (2) Flow를 실행할 JobFlowBulder를 생성한다. */
return new JobFlowBuilder(this).start(flow);
}
public JobFlowBuilder flow(Step step){
/* (3) Step을 실행할 FlowJobBulder를 생성한다. */
return new JobFlowBuilder(this).start(step);
}
- JobBuilder는 직접적으로 Job을 생성하는 것이 아니라 별도의 구체적 빌더를 생성하여 변환하여서 경우에 따라 Job생성 방법이 모두 다를수 있는 점을 유연하게 처리할 수 있습니다.
JobInstance
- JobInstance는 배치 처리에서 Job이 실행 될 때 하나의 Job 실행 단위이다. 만약 하루에 한 번 씩 배치의 Job이 실행된다면 어제와 오늘 실행 각각 Job을 JobInstance라고 부를 수 있습니다.
- 각각의 JobInstance는 하나의 JobExecution을 갖는 것은 아니다. 오늘 Job이 실행 했는데 실패했다면 다음날 동일한 JobInstance를 가지고 또 실행됩니다.
- Job 실행이 실패한다면 Jobinstance가 끝난것으로 간주하지 않기 때문입니다. 그렇다면 JobInstance는 어제 실패한 JobExecution과 오늘 성공한 JobExecution 두 개를 가지게 됩니다. 즉 JobExecution은 여러개 가질 수 있습니다.
요약
1. JobInstance는 Job이 실행 된다는 실행 단위
2. JobInstance는 어제 실행 한것이랑 오늘 실행한것이 같을수 없다는 것
3, JobInstance는 하나의 jobexecutiion을 갖는게 아니라는 것 왜냐면 성공,실패에 따라서 두 개의 JobExecution을 가질 수 있기 때문에. 그러면 JobExecution이란?
JobExcution
- JobExcution은 JobIstance에 대한 한 번의 실행을 나타내는 객체이다. 만약 오늘 Job이 실패해 내일 다시 동일한 Job을 실행하면 오늘/내일의 실행 모두 JobInstance 를 사용합니다.
- 실제로 JobExcution 인터페이스르 보면 Job 실행에 대한 정보를 담고 있는 도메인 객체가 있습니다.
- JobExcution은 JobInstace, 배치 실행 상태, 시작 시간, 끝난 시간, 실패했을 때 메시지 등의 정보를 담고 있습니다. JobExcution 객체 안에 어떤 실행 정보를 포함하고 있습니다.
요약
1. JobExcution은 JobInstance의 한 번의 실행을 나타내는 객체이다.
2. 오늘 Job이 실패하면 내일 동일한 Job이 실행된다. 그러면 오늘/내일 실행 모두 JobInstance를 사용한다.
3. JobExcution을 보면 Job에 대한 정보가 담겨있다.
4. JobExcution 에는 JobInstace, 배치 실행 상태, 시작 시간, 끝난 시간, 실패했을 때 메시지를 가지고 있다.
JobParameters
- JobParameters는 Job이 실행될 때 필요한 파라미터들은 Map 타입으로 지정하는 객체입니다.
- JobParameters는 JobInstance를 구분하는 기준이 되기도 합니다.
- JobParameters와 Jobinstance는 1:1 관계이다.
Step
- Step은 실질적인 배치 처리를 정의하고 제어 하는데 필요한 모든 정보가 있는 도메인 객체, Job을 처리하는 실질적인 단위로 쓰인다.
- 모든 Job에는 1개 이상의 Step이 있어야한다.
요약
1. Job을 처리하는 실질적인 단위
StepExecution
- Job에 JobExecution Job 실행 정보가 있다면 Step에는 StepExecution이라는 Step 실행 정보를 담는 객체가 있다.
JobRepository
- JobRepository는 배치 처리 정보를 담고 있는 매커니즘입니다. 어떤 Job이 실행되었으면 몇 번 실행되었고 언제 끝났는지 등 배치 처리에 대한 메타데이터를 저장합니다.
- 예를들어 Job하나가 실행되면 JobRepository에서는 배치 실행에 관련된 정보를 담고 있는 도메인 JobExecution을 생성합니다.
- JobRepository는 Step의 실행 정보를 담고 있는 StepExecution도 저장소에 저장하여 전체 메타데이터를 저장/관리하는 역할을 수행합니다.
요약
1. 배치 처리 정보를 담고 있는 저장소이다.
2. Job이 실행되면 JobExecution을 생성합니다.
JobLauncher
- JobLauncher는 Job, JobParameters와 함께 배치를 실행하는 인터페이스이다.
ItemReader
- ItemReader는 Step의 대상이 되는 배치 데이터를 읽어오는 인터페이스입니다. File, XML Db등 여러 타입의 데이터를 읽어올 수 있다.
ItemProcessor
- ItemProcessor는 ItemReader로 읽어 온 배치 데이터를 변환하는 역할을 수행합니다. 이것을 분리하는 이유는
- 비즈니스 로직의 분리 : ItemWriter는 저장을 수행하고, ItemProcessor는 로직 처리만 수행해 역할을 명확하게 분리합니다.
- 읽어온 배치 데이터와 씌여질 데이터의 타입이 다를 경우에 대응할 수 있기 때문입니다.
요약
1. 읽어온 배치 데이터를 변환하는 역할을 한다.
2. 읽어온 배치 데이터와 씌여질 데이터의 타입이 다를 경우에 대응가능.
ItemWriter
- ItemWriter는 배치 데이터를 저장합니다. 일반적으로 DB나 파일에 저정합니다.
- ItemWriter도 ItemReader와 비슷한 방식으로 구현합니다. 제네릭으로 원하는 타입을 받고 write() 메서드는 List를 사용해서 저장한 타입의 리스트를 매개변수로 받습니다.
잡은 보통 실행 시점에 JobParameter와 엮어 Job 자신의 런타임 로직을 매개변수화합니다.
(예를 들면 특정 날짜에 해당되는 레코드만 처리하는 잡이 그런 경우이다.)
그리고 잡 실행을 식별하기 위해 JobInstance를 생성합니다.
JobParameter가 연관 되어 있으니 JobInstance는 하나밖에 없겠죠.
같은 JobInstance(즉, 같은 Job+ JobParameter 세트가 실행되는 것을 jobExecution이라고 부릅니다.)
JobExecution은 잡 버번에 대한 런타임 컨텍스트로, 이상적으로는 JobInstance당 하나의 jobExecution은 잡 (제일 처음 JobInstance가 실행될 때 만들어진 JobExecution)이 존재합니다.
그러나 도중 에러가 나면 JobInstance는 다시 시작해야하고 그러다 보면 jobExecution이 하나 더 만들어지겠죠.
초기 잡에 속한 각 스템의 JobExecution에는 SteExecution이 있습니다.
개념 | 설명 |
Job | |
JobInstance | |
JobExecution | |
JobRepository | 스프링 배치의 첫 단추, 핵심 중의 핵심. JobRepository 인스턴스는 DB를 전제로 작동하므로 스프링 배치용 스키마는 미리 구성되어 있어야 한다. DataSourceInitializer를 사용하는 것이 db를 초기화하는 가장 간단한 방법이다. |
반응형
'Spring > Spring Batch' 카테고리의 다른 글
스프링배치_완벽가이드_3장_거래명세서 생성 (0) | 2021.07.15 |
---|---|
스프링배치_완벽가이드_2장 스프링 배치 (0) | 2021.07.14 |
스프링배치_완벽가이드_1장 배치와 스프링 (0) | 2021.07.06 |
Spring Batch - 0 개념 (0) | 2021.01.27 |
Spring Batch - 1 (0) | 2021.01.19 |