Spring Boot
@ComponentScan vs scanBasePackages
작은별._.
2024. 9. 29. 22:00
728x90
Spring boot를 공부하다가 특정 패키지 하위의 클래스들만 bean으로 등록하고 싶은 경우가 생겼습니다. 이 경우, 크게 2가지 방법으로 해결이 가능합니다.
예를 들어, 아래 그림의 hello.aop.order 패키지 하위의 클래스들만 bean으로 등록하고 싶은 경우를 생각해 보겠습니다.
1. @ComponentScan의 basePackages로 패키지 경로 지정
아래 코드와 같이 @ComponentScan 의 basePackages 속성에 해당 패키지 경로를 지정한 후, 생성된 bean을 출력해 보면 hello.aop.order 패키지 내부의 @Component 들만 bean으로 등록됨을 확인할 수 있습니다.
@SpringBootApplication
@ComponentScan(basePackages = "hello.aop.order")
public class AopApplication {
private static ApplicationContext context;
public static void main(String[] args) {
context = SpringApplication.run(AopApplication.class, args);
printBeanList(); // 생성된 bean 출력
}
public static void printBeanList() {
String[] beans = context.getBeanDefinitionNames();
for(String bean: beans) {
System.out.println("Bean Definition Name: " + bean);
}
}
}
- 장점: @ComponentScan이 명시적으로 사용되므로, 스프링 컨텍스트가 어떤 패키지를 스캔하는지 분명히 알 수 있습니다. 다른 개발자가 코드를 읽을 때, 스캔할 패키지를 한눈에 확인할 수 있어 이해하기 쉽습니다.
- 단점: 조금 더 길어질 수 있으며, 여러 패키지를 스캔해야 할 경우 설정이 복잡해질 수 있습니다.
2. @SpringBootApplication의 scanBasePackages로 패키지 경로 지정
1번째 방법과 코드의 차이는 @ComponentScan이 아닌, @SpringBootApplication 내부의 scanBasePackages 속성에 해당 패키지 경로를 명시하는 것뿐입니다. 이렇게 하여도 원하는 bean 들만 등록할 수 있습니다.
@SpringBootApplication(scanBasePackages = "hello.aop.order")
public class AopApplication {
private static ApplicationContext context;
public static void main(String[] args) {
context = SpringApplication.run(AopApplication.class, args);
printBeanList();
}
public static void printBeanList() { String[] beans = context.getBeanDefinitionNames();
for(String bean: beans) { System.out.println("Bean Definition Name: " + bean); } }
}
- 장점: 모든 설정이 한 곳에 모여 있어, 더 간결하고 깔끔합니다. 특히 간단한 애플리케이션에서는 이 방법이 더 직관적으로 보일 수 있습니다.
- 단점: 많은 패키지를 스캔해야 할 경우, 설정이 늘어날 수 있어 가독성이 떨어질 수 있습니다. 또한, @SpringBootApplication의 다른 속성과 혼합되어 코드가 복잡해질 수 있습니다.
728x90
반응형