컴포넌트 스캔

gorapaduckoo·2023년 7월 6일
0

스프링 기본편

목록 보기
6/10
post-thumbnail

인프런 김영한님의 스프링 핵심 원리 - 기본편 강의 내용을 바탕으로 작성한 글입니다.


1. 컴포넌트 스캔이란?

@Configuration
public class AppConfig {
	
    @Bean
	public OrderService orderService() {
    	System.out.println("call orderService()");
    	return new OrderServiceImpl(discountPolicy());
    }
    
    @Bean
    public DiscountPolicy discountPolicy() {
    	System.out.println("call discountPolicy()");
    	return new FixDiscountPolicy();
    }
}

지금까지는 설정 정보 파일에 등록할 스프링 빈을 직접 나열해야 했다. 이러한 방식은 등록할 빈의 개수가 많아지면 번거롭다는 단점이 있다. 그래서 스프링에서는 컴포넌트 스캔이라는, 설정 정보가 없어도 스프링 빈을 자동으로 등록해주는 기능을 제공한다.

@Configuration
@ComponentScan
public class AutoAppConfig {
}

컴포넌트 스캔 기능을 사용하려면, 설정 정보 파일에 @ComponentScan을 붙여주면 된다. @ComponentScan@Component가 붙은 클래스들을 자동으로 스프링 빈으로 등록해주는 역할을 한다.

@Component
public class OrderServiceImpl implements OrderService {
	
	private final DiscountPolicy discountPolicy;
    
    @Autowired
    public OrderServiceImpl(DiscountPolicy discountPolicy) {
    	this.discountPolicy = discountPolicy;
    }
}

이제 위와 같이 이전에 작성했던 OrderServiceImpl, FixDiscountPolicy, RateDiscountPolicy 클래스에 @Component 어노테이션을 붙여주기만 하면 각 클래스는 컴포넌트 스캔의 대상이 된다.

OrderServiceImpl의 생성자에 붙은 @Autowired는 의존관계를 자동으로 주입해주는 어노테이션으로, 위 코드에서는 discountPolicy 빈을 찾아서 주입해주는 역할을 한다.
이전에는 AppConfig에서 의존관계를 직접 명시했지만, 이제는 설정 정보가 없기 때문에 @Autowired를 통해 의존관계 주입도 클래스 내부에서 해결해주어야 한다.


2. 컴포넌트 스캔의 동작 과정

이제 애플리케이션을 실행해보자.


애플리케이션을 실행하면@ComponentScan에 의해 @Component가 붙은 클래스는 전부 스프링 빈으로 등록된다. 스프링 빈의 이름은 클래스명의 맨 앞글자를 소문자로 바꾼 게 된다.


그리고 @Autowired가 붙어 있는 곳에는 스프링 컨테이너가 타입이 일치하는 스프링 빈을 찾아서 자동으로 주입해준다.


3. 컴포넌트 스캔의 대상

컴포넌트 스캔은 @Component가 붙은 클래스 말고도 몇몇 어노테이션이 붙은 클래스를 스프링 빈으로 등록하는데, 각각 @Controller, @Service, @Repository, @Configuration 이다. 해당 인터페이스들은 모두 내부적으로 @Component를 포함하고 있기 때문에 컴포넌트 스캔의 대상이 된다.

@ComponentScan(basePackages = "hello.spring")

@ComponentScan은 클래스들을 전부 뒤져서 스프링 빈으로 등록할 클래스를 찾아낸다. 이처럼 모든 클래스를 탐색하려면 시간이 오래 걸릴 수 있기 때문에, basePackages 속성을 통해 탐색 시작 위치를 지정할 수 있다. 위의 경우에는 hello.spring의 패키지와 그 하위 패키지가 탐색 대상이 된다. 탐색 시작 위치를 지정하지 않은 경우에는, @ComponentScan이 붙은 설정 정보 클래스가 속한 패키지가 시작 위치가 된다.

일반적으로는 탐색 시작 위치를 지정하기보다는 @ComponentScan이 붙은 설정 정보 클래스를 프로젝트 최상단에 둔다. 스프링 부트를 사용할 때는 @SpringBootApplication을 프로젝트 최상단에 두는데, @SpringBootApplication@ComponentScan을 포함하고 있기 때문이다. (그래서 스프링부트를 사용하면 자동으로 컴포넌트 스캔이 된다!)

0개의 댓글