본 게시물은 김영한 선생님의 강의를 학습하며 작성하였습니다.
컴포넌트 스캔과 의존관계 자동 주입 시작하기
- 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의
등을 설정 정보에 직접 등록할 스프링 빈을 나열했다. - 예제에서는 몇개가 안되었지만,이렇게 등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기도 귀찮고, 설명 정보도 커지고, 누락하는 문제도 발생한다. 역시 개발자는 반복을 싫어한다.(무엇보다 귀찮다)
- 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 지공한다.
- 또 의존관계도 자동으로 주입하는
@Autowired
라는 기능도 제공한다.
탐색 위치와 기본 스캔 대상
@Configuration
@ComponentScan(
// basePackages = "com.hello.core.member", -> 지정하지 않으면 com.hello.core에서 다 뒤져보게 된다.
// -> 권장하는 방법: 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다!
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
컴포넌트 스캔 기본 대상
컴포넌트 스캔은 @Component
뿐만 아니라 다음과 같은 내용도 추가로 대상에 포함된다.
@Component
: 컴포넌트 스캔에서 사용@Controller
: 스프링 MVC 컨트롤러에서 사용@Service
: 스프링 비지니스 로직에서 사용@Repository
: 스프링 데이터 접근 게층에서 사용@Configuartion
: 스프링 설정 정보에서 사용
package com.hello.core.scan.filter;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
public class ComponentFilterAppConfigTest {
@Test
void filterScan() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
BeanA beanA = ac.getBean("beanA", BeanA.class);
assertThat(beanA).isNotNull();
// ac.getBean("beanB", BeanB.class);
assertThrows(
NoSuchBeanDefinitionException.class,
() -> ac.getBean("beanB", BeanB.class));
}
@Configuration
@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class), excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class))
static class ComponentFilterAppConfig {
}
}
중복 등록과 충돌
같은 이름이면 안된다… 대충 알아서 에러문구가 뜬다
수동 빈 등록 vs 자동 빈 등록
자동보다는 수동이 우선권을 가지는 것이 좋다. 하지만 현실은 개발자가 의도적으로 설정해서 이런 결과가 만들어지기 보다는 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 대부분이다.
그러면 정말 잡기 어려운 버그가 만들어진다.
그래서 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.
'Backend > Spring' 카테고리의 다른 글
[섹션 7] 옵션 처리 (0) | 2024.03.18 |
---|---|
[섹션 7]의존관계 자동 주입 - 다양한 의존관계 (0) | 2024.03.18 |
[섹션 5] @Configuation과 싱글톤 (0) | 2024.03.18 |
[섹션 4] 스프링 빈 설정 메타 정보 - BeanDefinition (0) | 2024.03.18 |
[섹션 4] 다양한 설정 형식 지원 - 자바 코드, XML (0) | 2024.03.18 |