티스토리 뷰
spring batch 에서는 batch 메타 테이블을 이용해 배치 잡의 메타 데이터들을 관리해준다.
job 의 실행 이력, 들어온 job parameters, 실행 결과 등을 말이다. 이 메타 테이블에 있는 정보를 이용해 spring batch 는 이전에 실행 이력이 있는 파라미터로 job 요청이 들어오면 job 실행을 중단할 수 있다. 하지만 이런식으로 job 실행을 막는건 여러모로 불편할때가 있다. 그래서 이를 무력화 하기위해 spring batch 는 기본 job parameters 에 유니크한 파라미터를 추가해주는 JobParametersIncrementer 라는 인터페이스를 제공한다. 그리고 이 인터페이스의 구현체인 RunIdIncrementer 클래스를 제공하고있다.
특별히 더 신경써줄것 없이 RunIdIncrementer 만 job 생성할때 넣어주면 job 실행에는 별 이슈가 없다. 하지만 이런저런 테스트를 하는 와중에 이슈를 하나 발견했는데 이전 job 실행에서 A 파라미터를 넣었다가 다음 job 실행에서 A 파라미터를 제외했는데도 불구하고 A 파라미터가 들어가고있는 것이다.
이 이슈를 맞이한 이유는 테스트 케이스를 작성하면서 명시적으로 job parameters 를 전달하다가, job parameters 가 null 인 경우에도 대응하기위해 null 대응 코드를 추가하고, job parameters 를 null 로 전달했음에도 정상적인(이전 실행) 값이 들어가고있어 알게되었다. 명시적으로 값을 넣지않았음에도 불구하고 이전 실행 내역의 파라미터가 추가되는 이유는 무엇일까?
spring batch 의 job 을 실행시키는 주체는 CommandLineJobRunner 인데 이 클래스를 확인해보면 그 이유를 알 수 있다. CommandLineJobRunner 에서 next 옵션쪽을 보면, 해당 옵션을 사용할 경우 이전 파라미터를 조회해서 가져오고 이전 파라미터와 현재 파라미터의 증분 내용을 적용한다고 나와있다. 즉 일단 이전 파라미터를 가져오고 해당 값중에 변경된 값이 있으면 적용하고 없으면 그대로 사용한다는 것이다. 때문에 위에서 발생한 이슈는 spring batch 의 스펙대로 잘 돌고있는 것이다.
일단 원인을 파악했으니 적당히 잘 우회해서 문제를 해결할 수 있었다. 우회가 아닌 정상적인 파훼법(?)은 내가 아직 batch 쪽 지식이 부족해서.. 좀 더 알아봐야할 것 같다. 일단 원인과 해당 이슈가 사실은 이슈가 아니라 스펙임을 정리해놓는다.
'Java > batch' 카테고리의 다른 글
JdbcPagingItemReader 에서 column not found (0) | 2021.08.28 |
---|---|
spring-batch 에서 TaskExecutor 사용시 jvm 종료 안 되는 현상 (1) | 2021.05.02 |
JpaItemWriter 이용시 merge 로 인한 select 쿼리 발생 이슈 (4) | 2021.04.25 |
spring batch builder 설정 메서드 정리 (0) | 2021.04.18 |
tasklet 에서 @BeforeStep 이 동작하지 않을때 (0) | 2021.01.07 |
- Total
- Today
- Yesterday
- clean code
- servlet
- frontend개발환경
- Kotlin
- MySQL
- javascript
- java8
- 정규표현식
- Jackson
- Git
- JPA
- programming
- backend개발환경
- DesignPattern
- toby
- Design Pattern
- OOP
- mariadb
- generics
- go-core
- db
- spring cloud
- java
- Spring
- http
- code
- JavaScript Core
- EffectiveJava
- frontcode
- TEST
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |