728x90
1. 컴포넌트 스캔이란?
- 스프링이 스프링 Bean으로 등록될 준비가 된 클래스들을 스캔하여 Bean으로 등록해주는 과정
- 자바에서 스프링 빈을 등록하기 위해 @Bean을 사용해야 하지만, 하나하나 등록하는 게 번거로울 때 컴포넌트 스캔을 통해 스프링 빈을 등록함
- @Component 어노테이션이 붙어있는 클래스들은 전부 컴포넌트 스캔의 대상이 됨
- @Configuration, @Service, @Repository, @Controller 등의 어노테이션에도 전부 @Component가 포함되어 있어 자동으로 컴포넌트 스캔의 대상이 됨
2. 탐색 방법 및 기본 스캔 대상
- 탐색 방법
1) servlet-context.xml
해당 태그를 사용해 패키지 이름을 지정하면, 애플리케이션 실행 시 해당 패키지에서 어노테이션으로 지정된 클래스를 빈으로 만들어준다.
사용 방법은 아래와 같다.
<context:component-scan base-package="패키지이름" />
2) @ComponentScan
- 컴포넌트 스캔을 사용하기 위해서는 설정 정보 클래스에 @ComponentScan 어노테이션을 붙여줘야 한다.
- 컴포넌트 스캔의 범위: 설정 정보 클래스의 패키지를 포함한 모든 하위 패키지가 됨
이때 모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸릴 수 있음
👉 아래와 같이 꼭 필요한 위치부터 탐색을 시작할 수 있음
@ComponentScan {
#시작 위치 한 개
basePackages = "hello.core",
#시작 위치 여러 개
basePackages = {"hello.core", "hello.service"};
}
- basePackages: 탐색할 패키지의 시작 위치를 지정함. 이 패키지를 포함해서 하위 패키지를 모두 탐색함
- 만약 지정하지 않은 경우에는 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
* 권장
패키지 위치를 지정하지 않고 설정 정보 클래스의 위치를 프로젝트 최상단에 둠
모든 자바 클래스를 다 컴포넌트 스캔을 하면 시간이 오래 걸린다는 말과 모순되게
패키지 위치를 지정하지 않고 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 게 권장사항인 이유가 궁금해졌다.
그래서 그 이유를 찾아보았다.
권장하는 이유?
- 간편한 설정
: 패키지 위치를 명시적으로 지정하지 않아도 되므로 간편함 - 기본 패키지 스캔
: 설정 정보 클래스가 위치한 패키지부터 하위 패키지까지 모든 클래스를 스캔하므로
👉 프로젝트 내의 모든 클래스가 자동으로 스캔 대상이 됨 - 유연성
: 프로젝트의 구조를 변경해도 코드를 수정하지 않아도 됨. 새로운 패키지를 추가하거나 패키지를 이동시키더라도 스캔 대상이 자동으로 업데이트됨
결론
- 프로젝트 규모가 크지 않고 빈의 개수가 적을 경우 👉 설정 정보 클래스의 위치를 최상단으로
- 프로젝트가 매우 크거나 빈의 개수가 많을 경우 👉 패키지를 명시적으로 지정하여 스캔 범위를 좁히기
최상단 패키지인 hello.core 안에 AutoConfig와 같은 메인 설정 정보를 두고, @ComponentScan 어노테이션을 붙인다.
- 기본 스캔 대상
어노테이션명 | 설명 |
@Component | 컴포넌트 스캔에서 사용 |
@Controller | 컴포넌트 스캔, 스프링 MVC 컨트롤러에서 사용 |
@Service | 컴포넌트 스캔, 스프링 비즈니스 로직에서 사용 |
@Repository | 컴포넌트 스캔, 스프링 데이터 접근 계층(DAO)에서 사용 |
@Configuration | 컴포넌트 스캔, 스프링 설정 정보에서 사용 |
3. 의존관계 주입 순서
1) @ComponentScan
@Component 어노테이션이 붙은 모든 클래스를 스프링 빈으로 등록한다.
@Component("원하는 이름")을 통해 이름을 직접 부여할 수 있지만 일반적으로는 클래스 이름의 첫 글자를 소문자로 바꿔서 저장한다.
2)의존관계 자동 주입
생성자가 @Autowired나 @RequiredArgsConstructor를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
생성자에 파라미터가 많아도 다 찾아서 자동으로 주입한다.
참고
https://code-lab1.tistory.com/170
https://nancording.tistory.com/76
728x90
'Web > Spring' 카테고리의 다른 글
[Spring] Spring MVC란? (1) | 2024.05.03 |
---|---|
[Spring] JDBC 프로그래밍을 위한 API와 용어들 (0) | 2024.04.30 |
[Spring] DI 자동주입 (0) | 2024.04.14 |
[Spring] 의존성 주입과 제어 역행 (4) | 2024.04.10 |
[Spring] 스프링 컨테이너 (2) | 2024.04.10 |