@ComponentScan 은 애플리케이션 컨텍스트에서 사용 가능한 Spring Beans 를 결정하는 데에 사용됩니다.
@ComponentScan 의 basePakcageClasses 또는 basePackages 파라미터를 통해 스캔할 패키지를 설정할 수 있습니다.
두 파라미터가 모두 설정되지 않은 경우, @ComponentScan 은 주석이 달린 클래스의 패키지만을 대상으로 컴포넌트를 스캔합니다.
default package 에 속한 클래스에서 @ComponentScan 어노테이션을 사용하는 경우, 전체 클래스패스를 대상으로 스캔합니다.
전체 클래스 패스를 대상으로 컴포넌트 스캔이 진행될 경우 애플리케이션의 시작 속도가 느려지고, 스프링 프레임워크 패키지 자체를 스캔했기에 BeanDefinitionStoreException 으로 애플리케이션이 구동되지 못할 수 있습니다.
(참고 : package 가 org, org.springframework, 혹은 Null(default) 인 경우 warning log 를 출력함)
따라서, 해당 Rule 은 다음과 같은 상황에서 문제를 제기합니다.
- @ComponentScan, @SpringBootApplication, @ServletComponentScan 어노테이션이 default package 의 클래스에서 사용될 때
- @ComponentScan 이 명시적으로 default package 에서 사용될 때
규칙을 어긴 코드
import org.springframework.boot.SpringApplication;
@SpringBootApplication // 규칙을 어긴 코드; RootBootApp은 기본 패키지에 선언되어 있습니다.
public class RootBootApp {
...
}
@ComponentScan("")
public class Application {
...
}
규칙을 준수한 해결책
package hello;
import org.springframework.boot.SpringApplication;
@SpringBootApplication // Compliant; RootBootApp belongs to the "hello" package
public class RootBootApp {
...
}
If you like SONARKUBE, don’t forget to give me a star.