문제 상황
- Parameter 1 of constructor ... required a bean of type 'PasswordEncoder' that could not be found
(서비스 생성자 파라미터에서 주입 오류 발생) - AppConfig에서 @Bean으로 PasswordEncoder를 정상 등록했음에도
Could not autowire. No beans of 'PasswordEncoder' type found.
라는 에러가 계속 발생
원인 분석
- AppConfig(설정 클래스)를
com.example.config(=최상위) 패키지에 두었으나, - 메인 클래스(@SpringBootApplication)가 com.example.board 하위에 위치
→ Spring Boot의 기본 컴포넌트 스캔 정책상
메인 클래스 “하위” 패키지만 스캔
→ 최상위 config 패키지가 스캔 대상에서 누락됨 - 이로 인해 PasswordEncoder 빈(@Bean)이 등록되지 않아
서비스에서 주입 오류 발생
해결 방법
- 메인 클래스를 “최상위 패키지(com.example)”로 이동
- BoardApplication을 com.example에 두면
그 하위 전체(=config, board, user ...)가 스캔됨 - 모든 빈(@Bean, @Service, @Mapper 등)이 자동 등록
- BoardApplication을 com.example에 두면
- 또는,
AppConfig를 메인 클래스 하위 패키지(com.example.board.config)로 옮기기- 하위에 두면 무조건 스캔됨
- 대안:
- @ComponentScan(basePackages = "com.example")로 스캔 범위 명시적으로 확장
- (실무에서는 메인 클래스를 상위로 두는 게 더 보편적)
결과 및 교훈
- 메인 클래스를 “최상위 패키지”에 두었더니
PasswordEncoder 등 모든 빈 주입 문제가 바로 해결! - Spring Boot의 컴포넌트 스캔 기본 정책은
“메인 클래스와 그 하위 패키지”만 스캔
→ 최상위 config, 공통 유틸 등은 항상 “메인 클래스보다 하위/동일 위치”에 둘 것 - 또는, 스캔 범위를 명시적으로 확장할 것
마무리
빈 주입 오류, 컴포넌트 스캔 범위 체크가 최우선!
스프링 구조 설계 시 “메인 클래스, 설정 클래스의 위치”에 항상 주의하자!
'Archive > 예전 TIL' 카테고리의 다른 글
| [트러블슈팅] Spring 단위 테스트 실패 (0) | 2025.07.10 |
|---|---|
| [트러블슈팅] 윈도우 한글 경로(ClassNotFoundException)로 인한 자바/테스트 에러 (2) | 2025.07.08 |
| [트러블슈팅] FK 무결성 오류와 로그인 미구현 상태에서 user_id 입력 문제 (0) | 2025.07.02 |
| [트러블슈팅] @Controller vs @RestController, 404 에러 & 정상 동작 차이 (0) | 2025.06.28 |
| [트러블슈팅] MyBatis Mapper가 Bean으로 등록되지 않는 런타임 에러 해결 (0) | 2025.06.28 |