@ComponetScan

yookyungmin·2023년 5월 9일
0

컴포넌트 스캔이란?

  • @Component애노테이션이 붙은 클래스르 찾아서 자동으로 스프링 빈으로 등록
@Configuration
@ComponentScan(
        basePackages = "hello.core.member", //멤버 패키지부터 하위패키지끼 스캔 대상
        basePackageClasses = AutoAppConfig.class, //AutoAppConfig 이 클래스의 패키지를 탐색
        excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION, classes = Configuration.class)
) //@Configuration 어노테이션 붙은 클래스 컴포넌트 스캔 제외 대상
//권장방법 : 프로젝트를 최상단 패키지에 두고 basePackage를 생략
//부트를 사용하면 @SpringBootApplication을 프로젝트 시작 위치에 두는것이 관례 설정안에 @ComponentScan이들어있다.
//컴포넌트스캔은 @Component애노테이션이 붙은 클래스르 찾아서 자동으로 스프링 빈으로 등록
public class AutoAppConfig {
}

컴포넌트 스캔 기본 대상

  • @Componet컴포넌트 스캔에서 사용
  • @Controller : 스프링 MVC 컨트롤러에서 사용
  • @Service 스프링 비즈니스 로직에서 사용
  • @Repository 스프링 데이터 접근 계청에서 사용
  • @Configuration 스프링 설정 정보에서 사용
    어노테이션에는 상속 관계라는 것이 없지만 스프링에서 지원하는 기능이다

자동 빈 등록 vs 자동 빈등록

  • 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데 그이름이 같은 경우 스프링은 오류를 발생시킨다.
  • ConflictingBeanDefinitionException 예외 발생

자동 빈등록 vs 수동 빈등록

  • 이 경우 수동 빈 등록이 우선권을 가진다. 수동 빈이 자동 빈을 오버라이딩한다.

  • 빈 등록 충돌시 최근에는 스프링부트에서는 수동 빈등록과 자동 빈등록이 충돌이 나면 오류가 발생하도록 기본값을 바꾸었다.

  • consider renaming one of the beans or enabling overriding by setting spring.main spring.main.allow-bean-definition-overriding=true

  • 스프링 부트에서 오버라이딩이 안되게끔 막아놔서 false로 바꿔 오버라이딩을 할 수 있게 끔 해놓았다

  • 어설픈 추상화나 어설픈 우선순위가 있으면 오류를 잡기 어렵기 떄문에 명확한것이 중요하다.

0개의 댓글