Spring Batch 를 사용해서 Job 을 구성하면서 ItemReader, ItemProcessor 에 JobParameter 를 가져오기 위해서 @StepScope 를 사용하게 되면서 ItemReader Bean 의 생성 되지 않는 상황이 발생
Step 을 구성하는 코드는 아래와 같이 구성되어 있습니다.
ApiOrderGeneratorReader
라는 ItemReader 인터페이스를 구현한 구현체 입니다.
ApiOrderGeneratorReader
상세 코드는 단순히 JobParameter 로 제공 받은 값만큼 반복을 실행하는 클래스 입니다.
Batch 를 테스트 하기 위해서 Application 을 구동하게 되면 아래와 같이 Bean 을 생성하는 과정에서 예외가 발생하여 문제가 됩니다. 이러한 문제가 왜 발생하는지, 어떻게 해결 하는지를 알아보자.
Error Code
이런 케이스에 의해서 Scope 의 Bean 을 생성하지만 Proxy 객체로 생성을 합니다.
ApiOrderGeneratorReader
객체는 Proxy 객체이며, ApiOrderGeneratorProcessor
는 클래스 그대로 Bean 으로 등록된 것을 볼 수 있습니다.
이는 @JobScope, @StepScope 을 파고 들어가면 proxyMode = ScopedProxyMode.*TARGET_CLASS
* 선언되어 있고, Spring 이 Bean 생성 시 옵션을 보고 Proxy 로 생성합니다.
비슷하게 생각되는 부분은 Spring Data JPA 를 사용하면 영속성 컨텍스트에 연관관계 객체를 가져올 떄 Fatch.Lazy 하게 가져오면 연관관계 객체는 Proxy 객체로 가져와 객체를 대신 하는 것 비슷한 것으로 생각 됩니다.
Caused by: java.lang.IllegalArgumentException: No visible constructors in class com.lsm.batch.calculateBatch.generator.ApiOrderGeneratorReader
생성자를 찾을 수 없다고 한다…
생성자의 접근이 private 로 되어 있다… 이를 public 으로 고치면서 문제는 해결이 된다.
위와 같은 케이스도 있지만 아래와 같이 @JobScope, @StepScope 를 사용하면서 만날 수 있는 상황이 있으니 참고