2024.03.10 - [Spring/Batch Programming] - Spring Batch 실습(4)
이전까지 Spring Batch가 어떻게 동작하는지 알아봤다.
이제는 실전에 적용하려고 하는데 그전에 용어부터 파악하고 넘어가고자 한다.
- Job : 전체 배치 프로세스를 캡슐화한 도메인(클래스라고 생각)
- JobInstance : Job의 논리적 실행 단위를 나타내는 도메인(인스턴스 객체라고 생각)
- JobParameter : Job을 실행할 때 함께 사용되는 파라미터 도메인(JobInstance를 구분)
- JobExecution : Job의 단일 실행에 대한 도메인(실제 일어난 일에 대한 기본 저장)
- Step : 배치 작업의 독립적이고, 순차적인 단계를 캡슐화한 도메인
- StepExecution : Step의 단일 실행에 대한 도메인(실제 일어난 일에 대한 기본 저장)
- ExecutionContext : Batch의 세션 역할을 하는 도메인(Job, Step의 상태를 가짐)
- JobLauncher : Job을 실행시키는 도메인
- item Reader/Processor/Writer : 입력/비즈니스/출력 도메인
대부분 실습을 하면서 들었던 용어지만 생소한 용어도 있다.
위의 도메인들을 JobRepository에서 DB에 저장한다. 저장해서 뭘 할 수 있나,,?
→ 오류복구, 재시작 여부, 모니터링 등을 할 수있다.
실행 시나리오
- JobLauncher가 Job에 JobParameter를 넣어서 실행
- JobInstance 생성
- JobExecution 생성 / 실행
- StepExecution 순차 실행
실습환경 준비
여기서 기본 세팅을 해주었다. 그리고 Spring Batch를 사용하기 위해 의존성도 추가해서 파일을 생성해주었다.
그리고 SpringBoot는 어떤 DB를 쓰는지 자동으로 찾아서 스키마를 초기화시켜준다. 아래는 application.properties 코드다.
spring.application.name=spring-batch
spring.batch.jdbc.initialize-schema=always
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/spring.batch
spring.datasource.username=root
spring.datasource.password=admin
JobConfiguration.java
@Slf4j
@Configuration
public class JobConfiguration {
@Bean
public Job job(JobRepository jobRepository, Step step) {
return new JobBuilder("job", jobRepository)
.start(step)
.build();
}
@Bean
public Step step(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) {
return new StepBuilder("step", jobRepository)
.tasklet((a, b) -> {
log.info("step");
return RepeatStatus.FINISHED;
}, platformTransactionManager)
.build();
}
}
JobRepository는 Spring Batch를 사용하면, 자동으로 의존성 주입이 된다.
JobLauncher가 잘 실행되는 것을 볼 수있다. (뿌듯)
이제 재실행을 시켜보면 Step이 이미끝났거나, 재실행 될 수 없다고 한다. 동일한 파라미터를 통해서는 재실행이 되지 않게끔 처리 되어있기때문!
Job 파라미터를 바꿔주면 제대로 실행이 된다.
파라미터를 임의로 넣어주고 실행 시키니 잘 실행된다.
JOB_KEY가 달라졌고, JOB_PARAMETER 가 다르기 때문에 정상 진행되고, 인스턴스가 추가되는 걸 알 수있다.
정리
JOB_INSTANCE는 JOB이 실행될때마다 JOB_PARAMETER에 따라 생성이된다. 즉, 같은 파라미터에 대해서는 새로 생성이 되지 않는다. JOB_EXECUTION, STEP_EXECUTION도 연계적으로 생성된다.
이제 이 과정이 어떻게 이루어지는지 SpringBoot 에서의 코드 부분을 보겠다.
시작점은 BatchAutoConfiguration이라는 클래스이다. 이름 그대로 배치 자동설정에 대한 클래스이다.
이곳에 위에 실행화면에서 나온 jobLauncherApplicationRunner 함수가 나온다.
얘는 무슨역할을 할까?
우선 JobLauncherApplicationRunner의 역할은 ApplicationRunner 라는 인터페이스의 구현체이다.
ApplicationRunner은 어플리케이션이 실행할때 이것을 실행하라는 것이고, JobLauncherApplicationRunner의 run함수를 추적하다보면 결국 execute 함수가 나온다. 그리고 함수안에는 jobLauncher.run(job, parameters) 함수가 있어 jobLauncher를 실행한다.
다음으로는 SpringBootBatchConfiguration 클래스이다. DefaultBatchConfiguration을 상속하고 있다.
이 클래스에서는 JobRepository, JobLauncher와 같은 빈들을 자동생성 해주는 클래스이다.
마지막으로 DataSourceInitializerConfiguration 클래스이다. application.properties에서 어떤 DB를 쓰고 있는지 지정을 해주면 해당영역에서 그것을 읽고 자동설정을 해주는 클래스이다. 즉 DB 테이블을 자동생성 해준다는 것이다.
이 클래스의 상속관계를 계속 추적해가면 결국 InitializingBean이라는 인터페이스가 나온다. Bean이 초기화될때 후처리를 하는 인터페이스이다. 이것을 구현해서 DB를 초기화 시켜주는것을 볼수있다. 그럼 어떤 DB를 쓰는지는 어떻게 아는가?
☞ 바로 platformResolver를 통해서 알아낸다!
SpringBoot가 알아서 다해주기 때문에 사실 이렇게까지 자세히 알 필요는 없다. 하지만 Spring에 대해서 더 자세히 알고 싶고, 실력이 늘고 싶다면 이런 코드 하나하나를 들여다 보는게 정말 좋은 습관인 것같다.
2024.03.13 - [Spring/Batch Programming] - Spring Batch Job
'Spring > Batch Programming' 카테고리의 다른 글
Spring Batch Step (0) | 2024.03.13 |
---|---|
Spring Batch Job (0) | 2024.03.13 |
Spring Batch 실습(4) (0) | 2024.03.10 |
Spring Batch 실습(3) (0) | 2024.03.09 |
Spring Batch 실습(2) (0) | 2024.03.06 |