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 경로가 정확히 맞지 않으면 빈 주입에 실패한다.
해결방법
- 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
'개발로 사고하기' 카테고리의 다른 글
| 국토교통부 아파트 실거래가 API 활용기 (1) | 2025.09.25 |
|---|---|
| 😤 CORS? 403? API 호출 대참사 해결기 (0) | 2025.09.11 |
| 📊 경기도 인증 지역서점 데이터 시각화 — 지역별 분포 Bar Chart 구현기 (1) | 2025.08.25 |
| 경기데이터드림- 경기도 지역서점 데이터 OpenAPI 연동기 (3) | 2025.08.25 |
| 🦖 미니 공룡 게임으로 배우는 방향 벡터 완성 (3) | 2025.08.19 |