스프링 설정을 직접 수동으로 등록하던 방식은 프로젝트가 커질수록 유지보수가 어려워진다. 그래서 등장한 것이 컴포넌트 스캔(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를 통해 생성자 주입 가능
- 설정 클래스는 최상단 패키지에 위치시키는 것이 관례
'Spring' 카테고리의 다른 글
[Spring 완전 정복 시리즈] 17편 - 다양한 의존관계 자동 주입 방식 (1) | 2025.07.29 |
---|---|
[Spring 완전 정복 시리즈] 16편 - 컴포넌트 스캔 심화 (0) | 2025.07.29 |
[Spring 완전 정복 시리즈] 14편 - @Configuration과 바이트코드 조작의 마법 (1) | 2025.07.28 |
[Spring 완전 정복 시리즈] 13편 - 싱글톤 컨테이너의 원리와 설계 주의점 (1) | 2025.07.28 |
[Spring 완전 정복 시리즈] 12편 - 다양한 빈 조회와 스프링 컨테이너의 숨겨진 기능들 (2) | 2025.07.27 |