본문 바로가기
💻 트러블슈팅 (에러 해결)

직원을 뽑은 적이 없는데요? NoSuchBeanDefinitionException 원인과 해결법 완벽 정리

by 데브프리 2026. 7. 1.

안녕하세요, 여러분의 든든한 IT 길잡이 데브프리입니다.

 

스프링 부트(Spring Boot)의 강력한 핵심 기능 중 하나는 바로 '의존성 주입(DI)'입니다. 개발자가 직접 new 키워드로 객체를 생성하지 않아도, 스프링이 알아서 객체(Bean)를 만들고 필요한 곳에 조립해 주는 아주 마법 같은 기능이죠.

 

그런데 코드를 신나게 작성하고 서버를 실행하는 순간, 이런 무시무시한 에러 메시지와 함께 서버가 뻗어버리는 경우가 있습니다.

 

Field boardService in com.devfree.controller.BoardController required a bean of type 'com.devfree.service.BoardService' that could not be found.

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type...

 

"네가 달라고 한 그 객체(Bean), 우리 컨테이너 안에는 없는데?" 라며 스프링이 파업을 선언한 것입니다.

 

오늘은 초보 백엔드 개발자들이 가장 많이 겪는 'NoSuchBeanDefinitionException'의 원인을 재미있는 비유로 알아보고, 단 10초 만에 해결하는 방법을 확실하게 정리해 드리겠습니다!

 

1. NoSuchBeanDefinition 에러, 도대체 넌 누구냐? (미등록 직원 비유)

NoSuchBeanDefinitionException은 단어 그대로 "그런 이름이나 타입을 가진 빈(Bean, 객체)에 대한 정의(Definition)를 찾을 수 없다(NoSuch)"라는 뜻입니다.

스프링 부트 NoSuchBeanDefinitionException 에러 원인 비유
이 에러는 레스토랑(스프링)에 직원을 고용(빈 등록)하지도 않고, 일을 하라고 명령(주입 요청)했을 때 발생하는 에러입니다.

일상생활에 비유해 볼까요?

여러분이 식당 매니저(BoardController)입니다. 손님에게 주문을 받고 "주방장님! 여기 김치찌개 하나요!"라고 외쳤습니다(의존성 주입 요청). 그런데 알고 보니 이 식당에는 주방장(BoardService)을 아직 채용조차 하지 않았던 것입니다.

 

스프링 컨테이너(식당)는 자신이 고용하고 관리하는 직원(Bean)들만 다른 곳에 파견(주입)을 보낼 수 있습니다. 우리가 코드로 파일은 만들어 두었지만, 스프링에게 "이 친구 우리 직원으로 채용해 주세요!"라고 서류(어노테이션)를 제출하지 않으면 스프링은 그 클래스의 존재 자체를 모릅니다.

 

2. 스프링 부트에서 이 에러가 발생하는 원인과 해결 방법

이 에러를 해결하는 원리는 아주 명쾌합니다. 스프링 컨테이너가 해당 클래스를 자신의 관리 대상(Bean)으로 인식할 수 있도록 올바른 이름표(어노테이션)를 붙여주거나, 이력서(패키지 경로)를 올바른 곳에 제출하는 것입니다.

스프링 부트 컴포넌트 스캔 어노테이션 빈 등록
클래스 위에 @Service, @Repository 같은 명찰(어노테이션)을 달아주면 스프링이 이를 직원(Bean)으로 인식하고 컨테이너에 등록합니다.

원인 ①: 스프링 빈 등록 어노테이션 누락 (가장 흔한 실수)

가장 흔하게 발생하는 실수입니다. 클래스 파일은 열심히 만들었지만, 스프링에게 이 클래스를 객체로 만들어 관리해달라고 부탁하는 어노테이션을 빼먹은 경우입니다.

[잘못된 코드 - 에러 발생]

Java
 
// 🚨 @Service 어노테이션을 빼먹음! (스프링 입장에서는 그냥 일반 자바 파일일 뿐)
public class BoardService {
    public void saveBoard() {
        System.out.println("게시글 저장 로직");
    }
}

[해결된 코드] 클래스 역할에 맞는 스테레오타입(Stereotype) 어노테이션을 클래스 이름 바로 위에 붙여줍니다.

Java
 
import org.springframework.stereotype.Service;

@Service // 💡 "스프링아, 이 클래스를 Service 역할을 하는 직원(Bean)으로 고용해 줘!"
public class BoardService {
    public void saveBoard() {
        System.out.println("게시글 저장 로직");
    }
}
  • 참고: 컨트롤러는 @Controller 또는 @RestController, 서비스는 @Service, 리포지토리는 @Repository, 그 외의 공통 부품은 @Component를 붙여주면 됩니다.

원인 ②: 컴포넌트 스캔(Component Scan) 범위 이탈

어노테이션을 잘 붙였는데도 에러가 난다면 패키지(폴더) 구조를 의심해야 합니다. 스프링 부트는 기본적으로 메인 클래스(@SpringBootApplication이 있는 파일)가 위치한 패키지와 그 하위 패키지들만 뒤져서 빈(Bean)을 찾습니다.

  • [해결 방법]: 에러가 난 클래스 파일이 메인 클래스 파일보다 상위 폴더에 있거나 아예 다른 폴더 라인에 있지 않은지 확인하세요. 빈으로 등록할 모든 클래스는 반드시 메인 클래스의 하위 폴더에 있어야 스프링의 레이더망(컴포넌트 스캔)에 포착됩니다.

 

3. 요약: 트러블슈팅 체크리스트

NoSuchBeanDefinitionException을 마주했다면 당황하지 말고 아래 3가지를 체크하세요.

  1. 명찰(어노테이션) 확인: 에러 로그에서 required a bean of type '클래스명' 이라고 알려준 바로 그 '클래스' 파일을 열어, 상단에 @Service, @Repository, @Component가 제대로 붙어 있는지 확인합니다.
  2. 패키지 위치 확인: 해당 클래스가 메인 애플리케이션 클래스와 동일한 패키지 또는 그 아래에 예쁘게 위치하고 있는지 탐색기 트리 구조를 확인합니다.
  3. 인터페이스(Interface) 구현 확인: 만약 해당 타입이 인터페이스라면, 그 인터페이스를 구현(implements)한 실제 구현체 클래스에 어노테이션이 붙어 있는지 확인해야 합니다. (인터페이스 자체에는 붙이지 않습니다.)

 

마무리

내가 만든 소중한 코드를 스프링이 못 찾는다고 하니 처음엔 조금 서운할 수 있습니다. 하지만 이 에러는 컴퓨터가 망가진 것이 아니라, 단순히 "신입 사원 등록 절차를 깜빡했다"는 아주 사소한 해프닝일 뿐입니다.

 

에러가 난 클래스 파일로 찾아가서 빛나는 명찰(@Service 등) 하나만 달아주면 언제 그랬냐는 듯 서버가 초록색 불빛을 내며 쌩쌩 돌아갈 것입니다.

 

오늘 준비한 트러블슈팅 가이드가 여러분의 붉은 에러 창을 깨끗하게 지워주었기를 바랍니다. 오류를 고친 경험은 여러분의 가장 큰 자산이 됩니다. 막히는 에러가 있다면 언제든 댓글로 남겨주세요.

 

지금까지 데브프리였습니다. 감사합니다!