스파이더 웹 개발

컴포넌트 스캔 본문

Spring

컴포넌트 스캔

스파이더웹 2022. 7. 30. 00:09
728x90
반응형

컴포넌트 스캔이란?

수동으로 스프링 빈을 등록하는 방법이 아닌 자동으로 스프링 빈을 등록하는 방법

코드를 보면서 살펴보자

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

}

기존에 수동으로 빈을 등록하는 방법과는 다르게 @Bean 어노테이션이 붙은 메서드가 없는것을 알 수 있다. 그러면 어떻게 빈을 등록할 수 있을까? 그 방법은 빈을 등록하고자 하는 클래스에 @Component 어노테이션을 붙여주면 된다

@Component
public class OrderServiceImpl implements  OrderService{

해당 어노테이션을 붙여주면 컴포넌트 스캐은 컴포넌트 어노테이션이 붙은 클래스를 빈으로 등록하는데 의아한 점은 기존의 @Bean을 사용하였을때는 의존관계를 직접 명시하였는데, @Component 어노테이션을 사용하면 어디에도 명시하는 부분이 없다. 이때 @Autowried를 사용하면 의존관계를 자동으로 주입해주어 해당 부분도 해결되게 된다

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

 

Tip. 

스프링 부트를 사용하면 스프링 부트의 @SpringBootApplication의 @ComponentScan이 들어있다

 

컴포넌트 스캔 대상은 아래와 같은데, 아래 어노테이션을 살펴보면 전부 @Component가 들어있는것을 확인할 수 있다

  • @Component
  • @Controller
  • @Service
  • @Repository
  • @Configruation

 

중복 등록과 충돌

자동 등록 vs 자동 등록

이름이 같은 경우 스프링은 오류가 발생되는데 ConflictingBeanDefinitionException 예외가 발생된다

 

수동 등록 vs 자동 등록

해당 경우에는 수동 빈 등록이 우선권을 가진다 

그러나 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다. 수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러 Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

728x90
반응형

'Spring' 카테고리의 다른 글

빈 생명주기 콜백  (0) 2022.08.03
의존관계 자동 주입  (0) 2022.07.31
싱글톤 컨테이너  (0) 2022.07.29
스프링 컨테이너와 스프링 빈  (0) 2022.07.25
@Transactional 알고 쓰자  (0) 2022.07.24
Comments