개발 공부중

[Spring] 컴포넌트 스캔 @ComponentScan @Filter @Autowired 본문

SPRING BOOT

[Spring] 컴포넌트 스캔 @ComponentScan @Filter @Autowired

개발자 leelee 2026. 1. 18. 21:44

컴포넌트 스캔 (@ComponentScan)

기존에는 객체(Bean)를 스프링 컨테이너에 넣어달라고 직접 명시했다면,

컴포넌트 스캔은 "알아서 클래스를 찾아서 자동으로 스프링 빈으로 등록하는 기능"

 

@ComponentScan: 설정 정보 클래스 위 붙임 
@Component: 등록하고 싶은 클래스 위에 붙임

 

@ComponentScan 은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록

 

 

필터 (@Filter)

includeFilters : 컴포넌트 스캔 대상을 추가로 지정

excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정

 

@Configuration
@ComponentScan(
// 하위 패키지까지 스캔
    basePackages = "com.example.demo",
    
    // Configuration이 붙은 클래스는 스캔 대상에서 제외
    excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}

 

 

오토와이어드 (@Autowired)

생성자에 @Autowired를 붙여주면,

스프링이 빈을 생성할 때 타입을 보고 알맞은 의존성(객체)을 자동으로 찾아서 주입

(타입이 같은 빈을 찾음)

 

@Component
public class OrderServiceImpl implements OrderService {
    
    private final MemberRepository memberRepository;

    @Autowired // 생성자가 하나라면 생략 가능 (스프링 부트)
    public OrderServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

컴포넌트 스캔은

@Component, @Controller, @Service, @ Repository, @Configuration

도 스캔 대상에 포함

 

 

 

컴포넌트 스캔에서 같은 이름의 빈이 등록되는 경우 


1. 자동 빈 등록 vs 자동 빈 등록
만약 서로 다른 패키지에 같은 이름의 클래스(예: service.MemberService, domain.MemberService)가 있고 둘 다 @Component가 붙어있다면? 스프링은 ConflictingBeanDefinitionException 예외를 발생시킴

해결: 클래스 이름을 변경하거나, @Component("customName")처럼 이름을 직접 지정하기


2. 수동 빈 등록 vs 자동 빈 등록
AppConfig에 수동으로 등록한 빈 이름과, @Component로 자동 등록된 빈 이름이 충돌하면?

과거 스프링은 수동 등록 빈이 우선권을 가졌지만(자동 빈을 오버라이딩).
최근 스프링 부트는 설정 실수를 방지하기 위해 기본적으로 에러를 발생시키도록 변경

*************************** APPLICATION FAILED TO START ***************************
Description:

The bean 'memberService', defined in class path resource [(경로)/DependencyConfig.class], could not be registered. A bean with that name has already been defined in file [(경로)/member/MemberService.class] and overriding is disabled.

Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

 

 

 

Action 에 있는 메시지를 보고

application.properties 파일에 위 코드를 입력하면 오버라이딩 가능하도록 변경됨

 

Comments