Spring/스프링 핵심 원리

컴포넌트 스캔

mint* 2023. 2. 23. 00:37
728x90

스프링 핵심원리-기본편 (김영한님) 수업을 듣고 정리한 글입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

컴포넌트 스캔 @ComponentScan

스프링 빈을 자동으로 등록해주는 기능

@Bean 또는 <bean> 등을 통해서 직접 등록하지 않아도 된다.

=> AppConfig에서 @Bean을 이용해서 직접 설정 정보와 의존관계를 명시할 필요가 없다.

 

@Autowired : 의존관계를 자동으로 주입하는 기능도 있다.

1. 새로 Config 파일을 만든다.

이전의 AppConfig 파일이 적용되지않기 위해 excludeFilters를 사용한다. AppConfig의 @Configuration 이 @Component 어노테이션을 포함하고 있기 때문이다.

 

2. 사용할 클래스들에게 @Component 어노테이션을 붙인다. (스캔이 되도록)

생성자 코드를 보면 의존관계를 주입해야한다 -> @Autowired: 자동으로 의존관계를 주입해준다.

 

테스트 코드 작성

잘 수행된다.

동작 그림

탐색 위치와 기본 스캔 대상

basePackages: 탐색할 패키지의 시작 위치 지정

com.hello (프로젝트 시작 루트)에 설정 정보를 두면 그 하위 모두가 컴포넌트 스캔의 대상이 된다.

(스프링 부트를 사용하면 @SpringBootApplication을 시작 루트 위치에 두는 것이 관례이다. 이 설정안에 @ComponentScan이 있다.)

 

컴포넌트 스캔 기본 대상

@Component, @Controller, @Service, @Repository, @Configuration

=> 각각의 소스코드에 @Component를 포함하고있다.

애노테이션 부가기능

필터

includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.

excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정한다.

 

어노테이션 만들기

클래스 생성(beanA, beanB)

테스트 만들기

includeFilters를 이용해 @MyIncludeComponent 있는 클래스-beanA를 스캔 대상에 추가한다.

excludeFilters를 이용해 @MyExcludeComponent 있는 클래스-beanB를 스캔 대상에 제외한다.

 

스캔대상에 추가하면 ac.getBean 할때 반환할 객체가 있지만, 스캔대상 제외하면 반환할 객체가 없다.

 

중복 등록과 충돌

1. 자동빈등록 vs 자동빈등록 이름충돌=> 빈이름 같을때 ConflictingBeanDefinitionException 예외 발생

2. 수동빈등록 vs 자동빈등록 이름충돌 => 수동 빈 등록이 우선권을 가지고 오버라이딩한다.

최근 스프링부트에서는 수동빈등록 vs 자동빈등록 충돌시 오류가 발생하도록 기본값을 바꿨다..(애매한 오류가 발생가능하므로)

 

 

728x90