개발로 사고하기

🚨 Spring Boot Kafka 개발 중 “No qualifying bean” 에러 해결기

tues 2025. 9. 7. 14:54

Kafka 이벤트 발행/소비를 구현하면서,

ShareController 에서 ShareEventProducer 를 주입받아 /shares 요청을 처리하도록 만들었다.
하지만 실행 직후 아래와 같은 에러로 애플리케이션이 뜨지 않았다.

 

로그에 찍힌 에러:

Parameter 0 of constructor in com.kafka.demo.ShareController 
required a bean of type 'com.kafka.demo.ShareEventProducer' that could not be found.

 

 

원인

  • ShareController 는 com.kafka.demo.ShareEventProducer 타입을 의존.
  • 실제 클래스는 com.kafka.demo.producer.ShareEventProducer 에 존재.
  • 패키지 불일치로 인해 스프링이 해당 빈을 찾을 수 없었던 것.
  • 스프링의 컴포넌트 스캔은 @SpringBootApplication 이 선언된 패키지의 하위 패키지만 대상으로 동작한다.
  • 따라서 import 경로가 정확히 맞지 않으면 빈 주입에 실패한다.

해결방법

  1. ShareController 에서 올바른 import 적용:
@Service
public class ShareEventProducer { ... }

 

2. ShareEventProducer 클래스에 @Service 추가:

import com.kafka.demo.producer.ShareEventProducer;

 

 

3. 메인 클래스(DemoApplication)는 com.kafka.demo 최상위에 위치해 서브 패키지를 스캔하도록 유지.

빌드 후 다시 실행하니 정상적으로 서버가 기동되었고, /shares 요청이 Kafka share.created.v1 토픽으로 메시지를 발행했다.

원칙 & 교훈

  • FQCN(Fully Qualified Class Name) 은 패키지 + 클래스명 조합으로 스프링 빈을 찾는 기준이다.
  • 컨트롤러 → 서비스 → 리포지토리 구조를 만들 때는 패키지/임포트 경로를 일관되게 관리해야 한다.
  • 스프링의 컴포넌트 스캔은 @SpringBootApplication 의 패키지를 기준으로 하위 패키지까지 탐색한다는 점을 잊지 말자.
 

 

참고자료

https://docs.spring.io/spring-framework/reference/core/beans/classpath-scanning.html

 

Classpath Scanning and Managed Components :: Spring Framework

By default, classes annotated with @Component, @Repository, @Service, @Controller, @Configuration, or a custom annotation that itself is annotated with @Component are the only detected candidate components. However, you can modify and extend this behavior

docs.spring.io