컴포넌트 스캔
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
classes = Configuration.class)
)
public class AutoAppConfig {
}
- 스프링 설정 파일에 @ComponentScan 선언 시 @Component로 선언된 클래스를 찾아서 자동으로 스프링 빈으로 등록한다.
- 스프링 설정 파일에 @Bean으로 따로 등록하지 않아도 스프링 빈으로 등록해준다.
- excludeFilters 옵션으로 컴포넌트 스캔 제외 대상을 지정할 수 있다.
- excludeFilters 옵션으로 컴포넌트 스캔 대상을 지정할 수 있다.
- 컴포넌트 스캔 : @Component 어노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
public class MemberService implements Service {
private Repository repository;
@Autowired
public MemberService(Repository repository) {
this.repository = repository
}
...
}
- 자동 의존관계 주입하는 방법으로 생성자에 @Autowired를 붙여주는 것이다.
- @Autowired : 의존관계를 자동으로 주입시켜주는 어노테이션이다.
- 컴포넌트 스캔과 자동 의존관계 주입 동작 원리
- 컴포넌트 스캔 @ComponentScan
- @ComponentScan이 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
- 스프링 빈의 이름은 클래스명을 사용하되 맨 앞글자만 소문자로 사용한다.
- 의존관계 자동 주입 @Autowired
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
- 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.
getBean(클래스.class)와 동일하다.
- 컴포넌트 스캔 @ComponentScan
- @ComponentScan(basePackage = .... ) - basePackage 옵션으로 컴포넌트 스캔 범위를 지정할 수 있다.
- 해당 패키지를 포함한 하위 패키지를 모두 탐색한다.
- 중괄호로 묶어서 여러 패키지를 지정할 수 있다.
- 설정 정보 클래스의 패키지를 기준으로 해당 패키지를 포함한 하위 패키지에서 찾는다.
- 권장하는 방법으로는 패키지 위치를 지정하지 않고 설정 정보 클래스의 위치를 프로젝트 최상단에 위치시키는 것
- 컴포넌트 스캔 기본 대상
- @Component를 제외한 기본 대상에는 내부에 @Component가 붙어있으며 부가 기능을 수행한다.
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- 스프링 MVC 컨트롤러로 인식한다.
- @Service : 스프링 비지니스 로직에서 사용
- 특별한 처리를 하지는 않지만 다른 개발자들이 비지니스 계층을 인식하는데 도움을 준다.
- @Repository : 스프링 데이터 접근 계층에서 사용
- 스프링 데이터 접근 계층으로 인식하고 테이터 계층의 예외를 스프링 예외로 변환해준다.
- @Configuration : 스프링 설정 정보에서 사용
- 스프링 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다.
- 어노테이션에는 상속관계가 없기에 특정 어노테이션을 인식할 수 있게 하는 것은 스프링이 지원하는 기능이다.
- 컴포넌트 스캔 시 같은 이름인 경우?
- 자동 빈 등록 vs 자동 빈 등록의 경우
- 예외가 발생한다.
- 수동 빈 등록 vs 자동 빈 등록의 경우
- 수동 빈 등록이 우선권을 갖는다. (수동 빈이 자동 빈을 오버라이딩한다.)
- 의도치 않게 이런 경우가 발생하는 경우가 많기 때문에 최근부터는 스프링 부트에서 오류를 발생 시킨다.
- 자동 빈 등록 vs 자동 빈 등록의 경우
출처 : [인프런 김영한 스프링 핵심 원리 - 기본편]
스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런
김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보
www.inflearn.com
'Spring > [인프런 김영한 스프링 핵심 원리 -기본편]' 카테고리의 다른 글
[인프런 김영한 스프링 핵심 원리 - 기본편] 빈 생명주기 콜백 (0) | 2024.08.14 |
---|---|
[인프런 김영한 스프링 핵심 원리 - 기본편] 의존관계 자동 주입 (1) | 2024.08.14 |
[인프런 김영한 스프링 핵심 원리 - 기본편] 싱글톤 컨테이너 (0) | 2024.08.13 |
[인프런 김영한 스프링 핵심 원리 - 기본편] 스프링 컨테이너와 스프링 빈 (1) | 2024.08.13 |
[인프런 김영한 스프링 핵심 원리 - 기본편] 스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2024.08.12 |