Spring

[Spring 완전 정복 시리즈] 15편 - 컴포넌트 스캔의 시작

dev-nadan 2025. 7. 29. 12:46

스프링 설정을 직접 수동으로 등록하던 방식은 프로젝트가 커질수록 유지보수가 어려워진다. 그래서 등장한 것이 컴포넌트 스캔(Component Scan) 이다. 이 기능을 활용하면, 특정 어노테이션이 붙은 클래스들을 자동으로 스프링 컨테이너에 등록할 수 있다.

 

이번 편에서는 컴포넌트 스캔이 어떤 역할을 하고, 이를 통해 어떻게 의존 관계를 자동 주입받을 수 있는지 살펴본다.

 


컴포넌트 스캔이란?

스프링이 클래스패스를 스캔해서 @Component가 붙은 클래스를 자동으로 스프링 빈으로 등록해주는 기능이다.

@Configuration
@ComponentScan(
    excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}

 

  • @ComponentScan: 컴포넌트 스캔을 시작하겠다는 설정
  • excludeFilters: 특정 어노테이션을 가진 클래스는 제외

@Component로 자동 등록

아래처럼 클래스에 @Component를 붙이기만 하면 된다. 따로 @Bean 설정 없이 자동으로 빈 등록이 이루어진다.

@Component
public class MemoryMemberRepository implements MemberRepository {}

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

생성자 주입과 @Autowired

자동 등록만으로는 끝이 아니다. 의존성 주입도 자동으로 해줘야 제대로 작동한다. 이때 사용하는 것이 @Autowired.

@Component
public class MemberServiceImpl implements MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}
@Component
public class OrderServiceImpl implements OrderService {

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

 

  • 생성자 하나면 생략해도 자동 주입됨
  • 여러 의존성도 한 번에 주입 가능

테스트 코드로 확인

public class AutoAppConfigTest {

    @Test
    void basicScan() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);

        MemberService memberService = ac.getBean(MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
    }
}

AutoAppConfig.class를 기준으로 컴포넌트 스캔이 시작되고, MemberService가 정상적으로 빈으로 등록되었는지 확인하는 테스트다.

 


설계 원칙 정리

  • 컴포넌트 스캔으로 자동 빈 등록 가능
  • @Component가 붙은 클래스는 자동 등록 대상
  • @Autowired를 통해 생성자 주입 가능
  • 설정 클래스는 최상단 패키지에 위치시키는 것이 관례