📖 ✏️
- TIL 시리즈에 작성된 글은 '매일 매일 학습한 지식 조각을 메모해 놓은 포스팅'입니다. 공유가 아닌 개인적인 학습 내용 기록을 목적으로 작성되었음을 알려드립니다.
- 그 외 시리즈에 작성된 공유 목적의 포스팅은 시간이 날 때마다 별도로 작성하고 있습니다. 주로, TIL 시리즈에 작성된 내용에서 특정 주제를 선정하고, 더 깊이 공부한 후 정리하여 작성합니다.
컴포넌트 스캔 방식으로 스프링 Bean을 등록할 때, 모든 자바 클래스를 다 컴포넌트 스캔하는 것은 비효율적이다. 애플리케이션 개발에 필요한 위치부터 탐색하도록 시작 위치를 지정하는 것이 좋다. 탐색할 패키지의 시작 위치를 지정할 때는 @ComponentScan
안에 basePackages
를 사용한다. 아래와 같이 여러 시작 위치를 지정할 수도 있다.
@ComponentScan(
basePackages = "hello.core.member" // 하나의 탐색 위치만 지정하는 경우
basePackages = {"hello.core", "hello.service"} // 둘 이상의 탐색 위치를 지정하는 경우
basePackageClasses = AutoAppConfig.class // 해당 클래스가 속한 패키지를 탐색 위치로 지정한다.
}
참고
basePackageClasses
: 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.- 탐색 위치를 지정하지 않으면
@ComponentScan
이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
별도의 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 방법을 권장한다. 최근 스링 부트도 이와 같은 방식을 기본으로 제공한다.
예를 들어서 아래와 같이 프로젝트 구조가 나눠져 있다면, 프로젝트 시작 루트인 com.hello
에 AppConfig.class
같은 메인 설정 정보를 위치 시킨다. 그리고 @ComponentScan
애노테이션을 붙인다. basePackages
지정은 생략한다.
com.hello
com.hello.serivce
com.hello.repository
이렇게 되면, @ComponentScan
이 붙은 AppConfig.class
가 위치하고 있는 패키지가 탐색 시작 위치가 된다. AppConfig.class
가 프로젝트 시작 루트인 com.hello
에 위치하므로, com.hello
을 포함한 하위 패키지가 모두 컴포넌트 스캔의 대상이 된다. 한편, 프로젝트 메인 설정 정보는 프로젝트를 대표하는 정보이기 때문에 프로젝트 시작 루트 위치에 두는 것이 바람직하다.
참고
스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인@SpringBootApplication
을 프로젝트 시작 루트 위치에 두는 것이 관례다.@SpringBootApplication
설정은@ComponentScan
을 포함하고 있다.
컴포넌트 스캔은 @Component
뿐만 아니라 아래 애노테이션도 스캔 대상에 포함한다.
@Component
: 컴포넌트 스캔에서 사용 @Controlller
: 스프링 MVC 컨트롤러에서 사용 @Service
: 스프링 비즈니스 로직에서 사용 @Repository
: 스프링 데이터 접근 계층에서 사용 @Configuration
: 스프링 설정 정보에서 사용 해당 클래스의 소스 코드를 보면 @Component
를 포함하고 있다.
@Component
public @interface Controller {
}
@Component
public @interface Service {
}
@Component
public @interface Configuration {
}
참고
애노테이션에는 상속관계가 없다. 애노테이션이 특정 애노테이션을 포함하는 방식은 자바 언어가 지원하는 기능이 아니다. 스프링이 지원하는 기능이다.
참고
위 애노테이션은 컴포넌트 스캔의 용도 뿐만 아니라 아래와 같은 부가 기능을 수행한다.
@Controller
: 스프링 MVC 컨트롤러로 인식@Repository
: 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환@Configuration
: 스프링 설정 정보로 인식하고, 스프링 Bean이 싱글톤을 유지하도록 추가 처리
-@Service
: 특별한 기능은 없다. 하지만 개발자들이 핵심 비즈니스 로직이 위치한 클래스로 인식하는데 도움을 준다.