Spring Batch : SimpleJob의 Validator

    SimpleJob의 Validator

    SimpleJob의 Validator는 Job이 실행되기 전에 Job에 전달된 JobParameters가 정상적인지를 확인한다. Job은 실행 전에 JobInstance를 만드는데 JobInstance를 만드는데 JobParameters가 필요하다. 따라서 전달된 JobParameters가 정말 정상적인 것인지 확인이 필요하기 때문에 JobParameters 검증을 위한 Validator가 추가된다. 

     


    Validator 추가

    jobBuilderFactory.get("batchjob2")
            .start(step1())
            .next(step2())
            .next(step3())
            .validator(new DefaultJobParametersValidator()) // Validator 추가
            .build();

    Validator는 JobBuilderFactory를 통해 Job을 만드는 과정에서 validator() 메서드를 이용해서 Job에 추가해줄 수 있다.

     


    Validator가 사용되는 시점

    Validator는 실제 Job이 실행되기 전에 2번 사용된다. 

    • SimpleJobLauncher 클래스 →  validate()
    • Job 인터페이스 → AbstractJob 인터페이스 → Execute() → Validate() 

     

    아래에서 코드를 찾아가서 좀 더 확인해보고자 한다. 

    //SimpleJobLauncher
    
    job.getJobParametersValidator().validate(jobParameters);
    jobExecution = jobRepository.createJobExecution(job.getName(), jobParameters);

    SimpleJobLauncher는 Job을 실행하기 전에 JobInstance와 JobExecution을 생성한다. JobExecution을 생성하는 메서드에서 JobInstance를 생성하는데, JobInstance를 생성하는데는 정상적인 JobParameters가 필요하다. 따라서 JobExecution을 실행하기 전에 Job Parameters의 값을 검증하는 validate()가 실행된다. 

     

     

    SimpleJobLauncher는 Job이 만들어진 후, execute를 한다. execute는 AbstractJob의 execute 메서드를 타고 내려가게 된다. 이 때, 이 execute() 메서드에는 JobParameters가 정상인지 확인하는 validate 메서드가 한번 더 실행된다. 

     


    사용자 설정 Validator 생성 및 등록

    public class CustomJobParametersValidator implements JobParametersValidator {
    
        @Override
        public void validate(JobParameters parameters) throws JobParametersInvalidException {
    
            // 필수 parameter
            if (parameters.getString("name") == null) { // Debug 지정. 스프링이 실행할 때, 여기로 올 것임.
                throw new JobParametersInvalidException("name parameters is not found");
            }
        }
    }

    사용자 설정 Validator를 만들기 위해서는 JobParametersValidator Interface를 구현하면 된다. 이 때, JobParameters가 validate 메서드의 매개변수로 넘어오는데, JobParameters에서 필요한 값이 있는지를 확인하면 된다. 만약 값이 없다면 Exception을 Throw 해주고, 문제가 없으면 가만히 놔두면 된다. 이렇게 하면 사용자 설정 Validator 클래스를 구현한 것이 된다. 

            return jobBuilderFactory.get("batchJob1")
                    .start(step1())
                    .next(step2())
                    .next(step3())
                    .validator(new CustomJobParametersValidator()) // 사용자 설정 Validator
                    .build();
        }

    만든 사용자 설정 Validator는 JobBuilderfactory에 validator() 메서드에 생성해서 넣어주면 Job Validator가 등록된다. 

    Validator 메서드는 JobBuilderHelper 클래스에 있는 properties의 jobParametersValidator에 설정이 된다. 헬퍼 클래스에 설정된 properties 값은 build 메서드에서 SimpleJob이 생성될 때, 설정값을 통째로 넘겨주면서 생성된다. 

     


    DefaultJobParametersValidator : Spring Batch 제공.

    기본적으로 Spring Batch에서 제공하는 JobParameterValidator를 사용해도 큰 문제는 없다고 한다. DefaultJobParameterValidator의 특징은 다음과 같다.

    • Required Key / Optional Key를 설정해줘야 함.
    • Required Key가 없으면 Exception. Optional Key는 없어도 무방함.
    • Required Key, Optional Key가 아닌 Key 들어오면 Exception 발생

     

    코드 단위로 아래에서 더 살펴볼 수 있다. 

    .validator(new DefaultJobParametersValidator(new String[]{"name", "date"}, new String[]{"count"}))

    사용을 위해서는 위의 코드처럼 생성을 해주면 된다. 이 Validator는 내부적으로 RequiredKeys / OptionalKeys를 String 배열로 가지고 있다. RequiredKey는 Job 실행을 위해서 반드시 있어야 하는 키고, Optional은 없어도 되는 키다. 생성자에서 좌변이 RequiredKey, 우변이 Optional Key다.

    다음과 같이 생성자에서 확인할 수 있다. 생성자에 전달된 String 배열값을 Setter를 통해서 내부적으로 셋팅해둔다. 

    Validate는 다음과 같이 실행된다. 먼저 Optional Key에 대해 검사를 해본다. 지금 보고 있는 Key가 Optional key도 아니고, Required Key도 아니라면 잘못된 JobParameters가 전달되었다고 판단하고 Exception을 발생시킨다. 

     

     


    Validate 실패 시

    Validate 실패 시, Spring Batch가 제공하는 Validator의 경우 JobParameterInvalidException이 발생한다. 만약 사용자 설정 Validator를 사용한다면, 원치 않는 Key가 들어올 경우 JobParameterInvalidException이 발생하도록 코드를 작성해야한다. 

    댓글

    Designed by JB FACTORY