Skip to content

fix: EgovCommandLineRunner -next 옵션에서 병합한 JobParameters가 버려지는 문제 수정 - #295

Open
z3rotig4r wants to merge 1 commit into
eGovFramework:mainfrom
z3rotig4r:fix/commandlinerunner-next-job-parameters
Open

fix: EgovCommandLineRunner -next 옵션에서 병합한 JobParameters가 버려지는 문제 수정#295
z3rotig4r wants to merge 1 commit into
eGovFramework:mainfrom
z3rotig4r:fix/commandlinerunner-next-job-parameters

Conversation

@z3rotig4r

Copy link
Copy Markdown
Contributor

문제

EgovCommandLineRunner.start()-next 처리는 JobParametersIncrementer가 만든 증분 파라미터와 명령행 파라미터를 map으로 병합한 뒤 그 map을 쓰지 않고 new JobParameters()로 빈 파라미터를 만들어 JobLauncher에 넘깁니다.

JobParameters nextParameters = getNextJobParameters(job);
Map<String, JobParameter> map = new HashMap<>(nextParameters.getParameters());
map.putAll(jobParameters.getParameters());
jobParameters = new JobParameters();   // 병합한 map이 버려집니다

그 결과 -next로 실행하면 잡이 파라미터 0개로 기동해 증분 파라미터와 명령행 파라미터가 모두 사라집니다. 증분 파라미터가 유실되면 이미 완료된 JobInstance와 같은 파라미터로 재실행되어 JobInstanceAlreadyCompleteException이 발생합니다. 명령행으로 넘긴 기준일자가 빠진 채 잘못된 범위의 데이터를 처리하기도 합니다.

수정

병합한 map을 new JobParameters(map)으로 전달합니다.

병합 순서는 기존 코드 그대로입니다. 증분 파라미터로 map을 채우고 명령행 파라미터를 putAll로 덮으므로 이름이 겹치면 명령행 값이 우선합니다. Spring Batch 5.2.3 JobParametersBuilder.getNextJobParameters와 대조해 병합 순서가 같음을 확인했습니다. 우선순위 규칙은 바뀌지 않습니다.

map의 raw type도 함께 없앴습니다. 스타일 정리가 아니라 컴파일에 필요한 변경입니다. 생성자 시그니처가 JobParameters(Map<String, JobParameter<?>>)이므로 raw Map<String, JobParameter>를 그대로 두면 인자를 변환하지 못해 컴파일이 실패합니다(rawtypes 경고도 같이 사라집니다).

new JobParameters(Map)JobParameter 객체를 그대로 옮겨 담으므로 각 파라미터의 타입과 identifying 여부가 보존됩니다. 실행해 보면 run.idjava.lang.Long·identifying=true를 유지합니다.

증분값을 만드는 getNextJobParameters 자체는 이 PR에서 손대지 않았습니다.

검증

JobLauncher를 스텁으로 바꿔 실제로 전달된 JobParameters를 캡처하는 단위 테스트를 추가했습니다. 수정 전에는 파라미터가 0개라 두 케이스 모두 실패하고 수정 후에는 다음을 확인합니다.

  • 증분 파라미터(run.id)와 명령행 파라미터(targetDate)가 함께 전달됩니다.
  • 이름이 겹치면(run.id) 명령행 값이 증분값을 덮습니다.
  • 각 파라미터의 타입과 identifying 여부가 보존됩니다.

org.egovframe.rte.bat.core 모듈 mvn test 63건 green입니다. 실제 DB JobRepository를 붙인 수동 배치 실행은 하지 않았습니다. 파라미터가 JobLauncher까지 전달되는 경로를 스텁으로 캡처해 검증했습니다.

영향 범위

-next 옵션으로 실행하는 경로에만 해당합니다. -next를 쓰지 않으면 이 블록에 들어가지 않으므로 기존 동작은 그대로입니다. -next 사용 시에는 지금까지 빈 파라미터로 기동했던 잡이 병합된 파라미터를 받으며 기존 이력과 다른 JobInstance가 생성됩니다.

EgovCommandLineRunner.start()의 -next 처리는 JobParametersIncrementer가
만든 파라미터와 명령행 파라미터를 map으로 병합한 뒤, 그 map을 쓰지 않고
new JobParameters()로 빈 파라미터를 만들어 JobLauncher에 넘겼다.
그 결과 -next로 실행하면 잡이 파라미터 0개로 기동해 증분 파라미터와
명령행 파라미터가 모두 사라진다. 증분 파라미터가 유실되므로
JobInstanceAlreadyCompleteException이 발생하거나, 명령행으로 지정한
기준일자 등이 빠진 채 잘못된 데이터를 처리할 수 있다.

병합한 map을 new JobParameters(map)으로 전달하도록 고쳤다. 병합 순서는
기존과 같아 이름이 같으면 명령행 파라미터가 증분 파라미터를 덮어쓴다.
map의 raw type도 함께 제거했는데, 이는 생성자 시그니처
JobParameters(Map<String, JobParameter<?>>)와의 정합에 필요하다.
raw Map<String, JobParameter>를 그대로 두면 Map<String,JobParameter>를
Map<String,JobParameter<?>>로 변환할 수 없어 컴파일에 실패한다.

검증: JobLauncher 스텁으로 실제 전달된 JobParameters를 캡처하는 테스트를
추가했다. 수정 전에는 파라미터가 비어 있어 실패하고, 수정 후에는 증분
파라미터(run.id)와 명령행 파라미터(targetDate)가 함께 전달되며 이름이
겹칠 때 명령행 값이 우선하고 각 파라미터의 타입과 identifying 여부도
보존된다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant