Archive/예전 TIL

[트러블슈팅] PasswordEncoder 등 빈 주입 오류, 컴포넌트 스캔 누락

khu2172 2025. 7. 23. 00:54

문제 상황

  • 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)이 등록되지 않아
    서비스에서 주입 오류 발생

해결 방법

  1. 메인 클래스를 “최상위 패키지(com.example)”로 이동
    • BoardApplication을 com.example에 두면
      그 하위 전체(=config, board, user ...)가 스캔됨
    • 모든 빈(@Bean, @Service, @Mapper 등)이 자동 등록
  2. 또는,
    AppConfig를 메인 클래스 하위 패키지(com.example.board.config)로 옮기기
    • 하위에 두면 무조건 스캔됨
  3. 대안:
    • @ComponentScan(basePackages = "com.example")로 스캔 범위 명시적으로 확장
    • (실무에서는 메인 클래스를 상위로 두는 게 더 보편적)

결과 및 교훈

  • 메인 클래스를 “최상위 패키지”에 두었더니
    PasswordEncoder 등 모든 빈 주입 문제가 바로 해결!
  • Spring Boot의 컴포넌트 스캔 기본 정책은
    “메인 클래스와 그 하위 패키지”만 스캔

    → 최상위 config, 공통 유틸 등은 항상 “메인 클래스보다 하위/동일 위치”에 둘 것
  • 또는, 스캔 범위를 명시적으로 확장할 것

마무리

빈 주입 오류, 컴포넌트 스캔 범위 체크가 최우선!
스프링 구조 설계 시 “메인 클래스, 설정 클래스의 위치”에 항상 주의하자!