스프링

컴포넌트 스캔

salmon16 2023. 7. 17. 21:25

@Bean이나 <bean> 등의 설정 정보를 통해서 스프링 빈을 등록하는 방식은 스프링 빈이 많아 지면 귀찮기도 하고 누락될 수도 있다. 그래서 설정 정보가 없어도 자동으로 스프링 빈이 등록되는 컴포넌트 스캔이라는 기능을 제공한다.

컴포넌트 스캔을 사용하기 위해 Config 파일을 만들어 보자.

@Configuration
@ComponentScan
public class AutoAppConfig {

}

Config 파일에는 @Configuration, @ComponentScan 두개의 애노테이션이 필요하다.

이전의 설정 정보를 이용해서 스프링 빈을 등록하는 AppConfig와는 다르게 @Bean으로 등록한 클래스가 없다.

 

컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록해 준다.

이제 @Component 애노테이션을 붙여주자.

 

설정 정보를 사용하는 아래 코드와 동일하게 되려면

@Bean
public OrderService orderService() {    
    return new OrderServiceImpl(memberRepository(), discountPolicy());
}

아래와 같이 @Component 애노테이션을 구현 클래스에 붙여 주어야 한다.

memberRepository인터페이스의 구현 객체로는 MemoryMemberRepository

discounPolicy인터페이스의 구현 객체로는 RateDiscountPolicy

@Component
public class OrderServiceImpl implements OrderService{
}
@Component
public class MemoryMemberRepository implements MemberRepository{
}
@Component
public class RateDiscountPolicy implements DiscountPolicy{
}

하지만 설정 정보를 사용하는 Config와는 다르게 컴포넌트 스캔 방식의 Config 클래스에는 의존관계가 직접 명시되어 있지 않다 그래서 @Autowired라는 애노테이션을 사용해서 의존관계를 자동 주입되게 해주어야 한다.

@Autowired 애노테이션은 위의 예시에서 OrderServiceImpl의 생성자 위에 붙여 주면 된다. 

그러면 @Autowired가 타입에 맞는 스프링 빈을 자동 주입시켜 준다.

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

스프링 컨테이너 생성시 AnnotationConfigApplicationContext의 인자로 AutoAppConfig 클래스를  넘겨주어 스프킹 컨테이너를 생성시키는 것은 동일하다.

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);

컴포넌트 스캔 방식의 스프링 빈 등록 과정

먼저 @Component 애노테이션이 붙은 모든 클래스를 스프링 빈으로 등록 시킨다.

이때 스프링 빈의 이름은 클래스명에서 맨 앞글자만 소문자로 바꾸어 준다.

스프링 빈 이름을 바꾸고 싶으면 @Component("새로운 이름")으로 애노테이션을 붙이면 된다.

 

그후 의존관계 자동 주입을 한다 생성자에 @Autowired되어 있는 곳에 스프링 컨테이너가 자동으로 해당  타입의 스프링 빈을 찾아서 주입한다. 

출처 : 인프런 스프링 핵심 원리 - 기본 편  김영한

'스프링' 카테고리의 다른 글

스프링 빈 필터  (0) 2023.07.18
컴포넌트 스캔 탐색 위치  (0) 2023.07.18
Configuration과 싱글톤  (0) 2023.07.14
싱글톤 방식의 주의점  (0) 2023.07.11
싱글톤 패턴, 싱글톤 컨테이너  (0) 2023.07.11