• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

multi datasource에서의 jobRegistryBeanPostProcessor

22.12.29 17:50 작성 조회수 475

0

안녕하세요, 회사에서 배치 업무 개발로 인해

현재 이 강의를 수강하고 있습니다.

강의는 다 수강하지 못하였지만, 배치 개발 중에 문제가 발생하여 질문 드립니다.

 

배치 프로젝트에 단일 datasource일 때에는,

jobRegistryBeanPostProcessor가 정상 작동합니다.

 

하지만, multiple datasource로 설정후에

jobRegistryBeanPostProcessor를 bean으로 등록시에는

datasource 관련 설정 값들을 읽어드리지 못하여

(@Value annotation을 이용하여 config.yml에서 읽어드리는데, null value return함)

서버가 구동조차 하지 않습니다.

 

서버가 구동하지 않아서 debug도 못하는 상황입니다..

아무리 구글링하여도 원인조차 찾을 수 없어 답답한 마음에 질문남깁니다.

답변 1

답변을 작성해보세요.

0

소스 공유 가능할까요

sonjs.01님의 프로필

sonjs.01

질문자

2023.01.02

안녕하세요, 소스 공유를 하고 싶으나 현재 개발중인 업무 소스라 공유가 불가능합니다..

답변이 아예 어려우실까요?

sonjs.01님의 프로필

sonjs.01

질문자

2023.01.02

해결되었는데, 명확한 원인을 모르겠습니다..

아직 스프링을 잘 몰라서 그런지....

 

먼저 질문 남긴것 처럼, 2개의 dataSource를 사용하면서

jobRepository의 dataSource 수정이 필요하다고 판단하였습니다.

 

그래서 DefaultBatchConfigurer를 상속 받는 config 파일을 만들고,

createJobRepository() 메서드를 override 할 때에,

dataSource 를 setting 해주는 부분에서 primary dataSource를 좀 더 명확하게 하고자

dataSource의 bean을 @Qualifier("defaultDataSource")로 주입 받은 값으로

setting 하였습니다.

근데 에러가 문의 드린 에러가 발생하여

@Quaifier로 명시한 부분을 제거하고 override 하였더니

jobRegistryBeanPostProcessor가 정상 작동합니다.

@EnableBatchProcessing
public Test extends DefaultBatchConfigurer {

   private final DataSource dataSource;

   @Autowired
   public Test(@Qualifier("defaultDataSource") DataSource dataSource) {
      this.datSource = dataSource;
   }
   
   @Override
   protected JobRepository createJobRepository() {
      JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean()
      factory.setDataSource(this.datSource)
      ...
      ...
      return factory.getObject();
   }

}

 

위 처럼 하였더니 dataSource bean 생성시, config.yml 에 세팅되어 있는 값을 읽어드리지 못하였는데,

그냥 @Qualifier 를 제거 하고 세팅하니 정상 작동합니다.....

 

@Qualifier 로 명확히 주입 받은 부분에서 문제가 발생한 듯 한데,

무엇이 문제 였을까요..?

 

JobRegistryBeanPostProcessor 정상 작동 코드

@EnableBatchProcessing
public Test extends DefaultBatchConfigurer {

   private final DataSource dataSource;

   @Autowired
   public Test(DataSource dataSource) {
      this.datSource = dataSource;
   }
   
   @Override
   protected JobRepository createJobRepository() {
      JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean()
      factory.setDataSource(this.datSource)
      ...
      ...
      return factory.getObject();
   }

}

 

보통 멀티 DB 설정을 하는 경우 스프링이 어떤 빈을 우선적으로 실행시켜야 하는지 표시하는 것으로 @Primary 나 @Qualifier 를 사용합니다.

설정상으로는 문제가 없어 보이는데요..

이 부분은 제가 소스를 직접 구성해서 테스트 해 봐야 알 것 같습니다.
정확한 원인이 파악이 되면 답변을 드리도록 하겠습니다.

혹 멀티 DB 구성한 설정관련 파일이라도 참고 가능할까요

sonjs.01님의 프로필

sonjs.01

질문자

2023.01.02

해결 되었는 줄 알았는데 착각이었네요...

@EnableBatchProcessing에서 자동으로 생성해주는 bean 들을

수동으로 bean으로 생성했더니 오류가 안나는 거였습니다..

즉, @EnableBatchProcessing을 사용하지 않고

batch 관련 bean들을 설정하니 실행이 되네요...

(전자정부 프레임워크의 배치 설정과 동일하게 설정 시)

 

DefaultBatchConfigurer를 상속 받고

상속 받은 클래스에서 DataSource 주입 받아서 오버라이딩 하면

질문과 마찬가지로 에러가 발생하네요.

 

멀티 db 구성 설정 파일은 제가 따로 프로젝트 생성하여서 git 주소 올리도록 하겠습니다.

 

sonjs.01님의 프로필

sonjs.01

질문자

2023.01.04

안녕하세요, 강사님.
현재 멀티 db 구성 설정 참고할 만한 프로젝트를 시간나는대로 만들고 있는데,
현재 개발하고 있는 업무 프로젝트 설정과
최대한 비슷하게 구성하려다 보니 시간이 조금 지체될 것 같습니다.

 

먼저 질문드린 에러에서 무엇이 문제인지 생각해보았습니다.
제 생각에는 DefaultBatchConfigurer 상속받는 클래스에서 DataSource를 DI 하는데,
DataSource 설정 값들이 config.yml에서 @Value에 의해 DI되는 구조여서,
JobRegistryBeanPostProcessor가 DataSource 설정 세팅 전에
동작하여 그런듯 합니다.

 

추가적으로, 질문이 있어서 답글로 남깁니다.

JobRegistryBeanPostProcessor를 @Bean으로 등록하다 보니
질문과 같은 에러가 발생하는데,
JobRegistryBeanPostProcessor 을 사용하지 않고 새로 @Bean을 등록하였습니다..

근데 그게 형태가 굉장히 웃긴 형태여서...

@Bean
public Void register(JobRegistry jobRegistry, List<Job> jobs) {
   for(Job job : jobs) {
      jobRegistry.register(new ReferenceJobFactory(job));
   }
   return null;
}

 

위와 같은 메서드를 Bean으로 등록해두면 job 실행은 잘됩니다.
잘 동작은하는데,,, 지금까지 개발하면서 Void return Type의 Bean은 본적이 없어서...

 

위와 같은 방법은 기능은 동작하나 스스로가 갸우뚱하게 되는데,
저런 Bean을 만들어서 진행하여도 무관할까요?

 

아니면 Factory로 만들어서 등록할까도 생각중에 있습니다.
명쾌한 답변 부탁드립니다.

근데 궁금한 점이 있는데요

JobRegistryBeanPostProcessor 와 멀티 DB 설정과 어떤 상관관계가 있을까요?

JobRegistryBeanPostProcessor 는 단지 JobRegistry 에 JobFactory 를 등록하는 처리를 하고 있고 DB 와는 아무런 상관이 없는 것 같은데요..

혹시 오류 메시지를 볼 수 있을까요?