스프링

job관련 트러블 슈팅

148june 2025. 6. 26. 20:05

🔧 Spring Batch Job 중복 빈 충돌 문제 해결 회고

🧩 문제 상황

Spring Batch 스케줄러를 설정하는 과정에서 다음과 같은 애플리케이션 실행 오류가 발생했습니다:

APPLICATION FAILED TO START

Parameter 1 of constructor in ProductStatJobScheduler required a single bean, but 2 were found:
- productTradeStatJob
- markDormantUserJob

이는 ProductStatJobScheduler 클래스에서 Job 타입의 빈을 주입받으려 했는데,
Spring 컨텍스트 내에 Job 타입의 빈이 두 개 이상 등록되어 있어
어떤 빈을 주입해야 할지 모호하다는 에러였습니다.


🔍 원인 분석

  • Job 타입의 빈은 ProductStatBatchConfig에서 productTradeStatJob으로,
    DormantUserJobConfig에서 markDormantUserJob으로 각각 등록되어 있었습니다.
  • 하지만 ProductStatJobScheduler는 @RequiredArgsConstructor를 통해
    자동으로 생성자를 만들고 있었고, Spring은 어떤 Job 빈을 넣어야 할지 알 수 없었습니다.
  • 즉, 동일한 타입(Job)의 빈이 2개 이상일 경우, 명시적으로 어떤 빈을 주입할지 지정하지 않으면
    Spring이 애플리케이션 실행을 중단하게 됩니다.

✅ 해결 방법

  1. ProductStatBatchConfig의 Job 빈에 명시적으로 이름을 지정했습니다:
  2. @Bean(name = "productTradeStatJob") public Job ProductTradeStatJob(...) { ... }
  3. @RequiredArgsConstructor 대신 수동 생성자 주입 방식으로 바꾸고,
    생성자 파라미터에 @Qualifier("productTradeStatJob")를 붙여
    명확하게 어떤 Job을 주입할지 지정했습니다:
  4. public ProductStatJobScheduler( JobLauncher jobLauncher, @Qualifier("productTradeStatJob") Job productStatDailyJob ) { this.jobLauncher = jobLauncher; this.productStatDailyJob = productStatDailyJob; }
  5. 또한 변수 이름 혼동을 피하기 위해, 필드명을 ProductStatDailyJob → productStatDailyJob로
    Java 네이밍 컨벤션에 맞춰 정리했습니다.

✅ 결과

  • 애플리케이션이 정상적으로 실행되었고,
  • ProductStatJobScheduler는 매일 00시 01분에 productTradeStatJob 배치를 실행할 수 있게 되었습니다.
  • Job 타입 빈이 다수 존재하는 상황에서도, @Qualifier를 통해 명확한 의도를 전달하여
    의존성 주입 충돌 문제를 안전하게 해결했습니다.

💡 배운 점

  • Spring에서 동일한 타입의 빈이 여러 개 있을 경우, @Qualifier를 적극 활용해야 한다.
  • @RequiredArgsConstructor는 간편하지만, @Qualifier와 함께 쓸 수 없으므로
    명시적인 생성자 선언이 필요한 경우가 있다.
  • 빈 이름(@Bean(name = "..."))과 주입 대상 이름(@Qualifier("..."))은 정확히 일치해야 한다.
  • 필드/메서드/변수 네이밍은 Java 관례를 따라야 혼동을 줄이고, 유지보수성을 높일 수 있다.

 

'스프링' 카테고리의 다른 글

우분투와 도커 설치  (3) 2025.07.02
테스트코드 트러블 슈팅  (1) 2025.07.01
상품 주문 통계 배치 작업 강의 대본  (0) 2025.06.19
스프링 배치  (0) 2025.06.16
5분기록  (2) 2025.06.09