우주먼지
article thumbnail

💡 Component Scan

 

★ 빈이름은 클래스명을 사용하며, 첫글자는 무조건 소문자 사용 ★

  • 지금까지 스프링 빈을 등록할때 @Bean이나 XML의 <bean>을 통해서 등록을 했다
  • 예제는 몇개 안되지만 실무에선 수백개가 넘기 떄문에 귀찮고 누락 문제도 발생
  • 그래서 설정정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 사용한다
  • 또, 의존관계도 자동으로 주입하는 @Autowired 기능도 제공한다
  • 바로 코드로 알아보자, 기존의 AppConfig는 학습용으로 냅두고 새로운 AutoAppConfig 클래스를 생성한다

AutoAppConfig 생성후 @ComponentScan 등록
구현체들에게 전부 @Component 등록
구현체의 생성자에 @Autowired를 붙여서 의존관계 주입
테스트클래스 생성 - 테스트 실행 - 테스트 성공

 

탐색 위치와 기본 스캔 대상

  • 일반적으로 프로젝트 최상단에 @ComponentScan을 잡으면 된다
    • @ComponentScan(basePackages = "hello.core) = 탐색위치 지정
    • @ComponentScan(basePackages = {"hello.core", "hello.service"} 여러개 지정도 가능
  • 스캔 대상
    • @Component
    • @Controller
    • @Service
    • @Repsitory
    • @Configuration

 

Filter

  • includeFilters = 컴포넌트 스캔 대상을 추가로 지정
  • excludeFilters = 컴포넌트 스캔에서 제외할 대상 지정
  • 바로 실습으로 알아보자

Custom&nbsp; Annotation 2개 생성, In / Exclude
클래스 A,B 생성후 각각 만든 어노테이션 할당
테스트 코드 작성 -> 성공

 

Filter Type Option

  • ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
    • ex) org.example.SomeAnnotation
  • ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
    • ex) org.example.SomeClass
  • ASPECTJ: AspectJ 패턴 사용
    • ex) org.example..*Service+
  • REGEX: 정규 표현식
    • ex) org\.example\.Default.*
  • CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
    • ex) org.example.MyTypeFilter

 

 

중복등록과 충돌 (빈 이름 충돌)

자동 vs 자동
수동 vs 자동


2가지 상황을 예시로 들어본다

 

자동 vs 자동

  • 기존 구현체에 붙인 @Component에 ("service") 이름을 똑같이 맟춰주고 테스트를 돌리면,
    ConflictingBeanDefinitionException이 뜸

 

수동 vs 자동

  • 기존 구현체에 붙은 @Component와 수동으로 추가한 빈 이름을 똑같이 테스트를 돌리면 테스트 성공은 하지만,
    수동 등록 빈이 우선순위가 높으므로 자동 빈을 오버라이딩 해버리지만,
    스프링 부트는 기본값으로 어플리케이션 실행 시 오류를 내면서 중지시킴
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그