인프런 김영한 선생님 스프링 핵심 원리 강의를 보고 정리한 내용입니다.
컴포넌트 스캔이란
- 설정 정보(AppConfig)가 없어도 자동으로 스프링 빈을 등록하는 기능
- 의존관계도 자동으로 주입하는 @Autowired 기능도 제공
1. @ComponentScan
- @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
- 이때 스프링 빈의 기본 이름은 클래스명을 사용하되, 맨 앞글자만 소문자로 바꿔준다.
이렇게 클래스 위에 @Component를 붙여주면 해당 클래스는 스프링 빈으로 등록된다.
Q. 그러면 기존에 의존관계 주입을 해주던 코드가 없어졌는데 어떻게 주입하나요?
A. @Autowired를 사용하면 됩니다.
2. @Autowired 지정하여 의존관계 자동 주입
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
- getBean(MemberRepository.class)와 동일하다고 보면 된다.
탐색할 위치와 기본 스캔 대상
@ComponentScan (
basePackages = "spring.core"
)
- basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
- 만약 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지를 시작 위치로 한다.
탐색 위치 권장 방법
- 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다.
- 프로젝트 시작 루트에 AppConfig 같은 메인 설정 정보를 두고 @ComponentScan 어노테이션을 붙인 뒤 basePakages 지정은 생략한다.
- 이렇게 하면 설정 정보 클래스의 패키지를 포함한 하위는 모두 자동으로 컴포넌트 스캔의 대상이 된다.
컴포넌트 스캔 기본 대상
컴포넌트 스캔은 @Component뿐만 아니라 아래의 어노테이션도 추가로 포함된다.
@Component
public @interface Controller {
}
@Component
public @interface Service {
}
@Component
public @interface Configuration {
}
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
중복 등록과 충돌
컴포넌트 스캔에서 같은 빈 이름을 등록하면 두 가지 상황이 발생한다.
- 자동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록 vs 자동 빈 등록
1. 자동 빈 등록 vs 자동 빈 등록
ConflictingBeanDefinitionException 예외 발생
2. 수동 빈 등록 vs 자동 빈 등록
수동 빈이 자동 빈을 오버라이딩하여 수동 빈이 등록 우선권을 가진다.
근데 최근 스프링부트에서 수동 비 등록된 자동 빈 등록이 충돌 나면 오류가 발생하도록 기본 값을 바꾸었다.
수동 빈이 등록 우선권을 가지고 가는 건 여러 설정들이 꼬여서 만들어지는 경우가 대부분이기 때문이다. (애매한 버그 생성기)
그러므로 가능한 한 코드를 명확하게 작성하거나 오류를 빠르게 잡는 것이 좋다.
'Dev > Spring' 카테고리의 다른 글
[Spring] BeanFactory와 ApplicationContext 차이점 (0) | 2023.09.15 |
---|---|
[Spring] 생성자 주입을 선택해야 하는 이유 (0) | 2023.09.14 |
[Spring] 싱글톤 패턴과 싱글톤 컨테이너 (0) | 2023.09.12 |
[Spring] 스프링 컨테이너 생성 및 조회 (0) | 2023.09.12 |
[Spring] 정적인 클래스 의존관계 vs. 동적인 객체 인스턴스 의존 관계 (0) | 2023.09.11 |