컴포넌트 스캔

byeol·2022년 11월 21일
0

6. 컴포넌트 스캔

직관적인 컴포넌트 스캔에 대해서 알아보자

✔️ 등록할 빈이 수백, 수천개라면🥲...-> 컴포넌트 스캔과 의존관계 자동 주입하는 @Autowired

컴포넌트 스캔은 컴포넌트가 붙은 클래스들을 스프링 빈에 등록한다.
컴포넌트 스캔을 어떻게 이용하는가?

  • 과정
  1. 컴포넌트 스캔이 @Component가 선언된 클래스를 스프링 빈에 등록 -> 빈이름 : 클래스명 앞 글자를 소문자로 바꾼 것이 이름이 된다
  2. 의존관계 주입 : 생성자에 @Autowired 지정 , 스프링 컨테이너가 타입이 같은 빈을 찾아 주입
  • 탐색 위치
    컴포넌트 스캔이 제한된 범위에서 @Component가 붙은 클래스가 스프링 빈에 등록하도록 설정할 수 있음
    @ComponentScan(
     //- 1) basePackages : 경로 포함 하위
     //basePackages="hello.core"
     //- 2) basePackageClasses : 지정 클래스의 패키지를 시작위치
     //basePackageClasses = MemberService.class
     //- 3) 없는 경우 이 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치
     // -4) 권장하는 방법 3의 방법으로 하되, 최상단에 설정정보 클래스를 두기
    )
         
  • 컴포넌트 스캔 대상: @Component , @Controller, @Service, @Repository, @Configuration

✔️ 필터를 통해서 컴포넌트 스캔 대상 지정 및 제외 대상 지정
내가 직접 annotation을 만든다.
@포함, @제외라는 annotation을 만들고 각각 추가할, 제외할 클래스에 선언하고
설정정보 클래스에서 아래와 같이 나타내자

@ComponentScan(
  includeFilters=@Filter(type=FilterType.ANNOTATION, classes = 포함.class),
  excludeFilters=@Filter(type=FilterType.ANNOTATION, classes = 제외.class)
  // 1. FilterType.ANNOTATION : 클래스나 에노테이션 인식
  // 2. FilterType.ASSIGNABLE_TYPE : 지정타입과 자식 타입도 같이 인식
  // 3. FilterType.ASPECTJ :AspectJ 페턴
  // ...REGEX : 정규식..
)

✔️ 같은 이름의 빈으로 인해서 발생하는 충돌

  • 첫번째 경우 : ComponentScan을 통해서 등록한 스프링 빈이 이름이 같아 충돌하면
    -> ConflictingBeanDefinitionException 예외 발생
  • 두번째 경우 : ComponentScan 자동 등록 스프링 빈 vs. Configuration,Bean 수동 등록 스프링 빈
    우선순위는 수동 등록한 스프링 빈으로 돌아간다.
    하지만 스프링 부트(겉껍질의 기능)가 개발자가 의도해서 수동 등록한 스프링 빈에게 우선순위를 줄리가 없다 그냥 실수인 경우가 많은 것으로 판단하여 오류가 발생하도록 기본값을 바꿔놓음
profile
꾸준하게 Ready, Set, Go!

0개의 댓글