일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 편향된 지수
- 기본키 전략
- JPA
- 백준
- spring
- Git
- 쿠키
- DTO
- @Autowired
- allocationSize
- 오블완
- 컴파일 타임 상수
- 리눅스
- 은행원알고리즘
- compgen
- m:n
- application layer
- 프로그래머스
- BindingResult
- intelij spring config
- 쉘 스크립트
- 커밋 되돌리기
- @SubscribeMapping
- 알고리즘
- JDBC
- 파이썬
- API
- 티스토리챌린지
- 런타임 상수
- 무한정 대기
- Today
- Total
둘셋 개발!
[spring] 컴포넌트 스캔 본문
스프링 빈을 등록할 때 @Bean을 일일이 붙여주었다.
하나하나 붙여주어야 하기 때문에 귀찮기도 하고 누락되는 경우도 생긴다.
그래서 스프링에서는 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.
그리고 의존관계를 자동으로 주입하는 @Autowired이라는 기능도 제공한다.
컴포넌트 스캔 적용 방법
1. @ComponetnScan을 설정 정보에 붙여준다.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
2. 스프링 빈으로 등록할 클래스에 @Component 애노테이션을 붙여주고
의존관계 주입은 생성자에 @Autowired를 붙여준다.
예시)
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
✔️컴포넌트 스캔은 @Component가 붙은 클래스를 스프링 빈으로 자동등록 해준다.
그림으로 보는 @ComponentScan과 @Autowired 동작 방식
1. @ComponentScan
➡️ 스프링 빈을 등록할 때의 빈 이름은 클래스 이름을 사용하는데, 클래스 이름의 가장 앞글자만 소문자로 바꿔서 등록한다.
2. @Autowired
➡️ @Autowired를 붙여주면 스프링 컨테이너가 타입이 같은 빈을 찾아서 주입해준다.
컴포넌트 스캔의 대상
✔️컴포넌트가 붙은 대상을 스캔할 때 시작위치를 지정할 수 있지만 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
- 김영한 강사님은 따로 시작위치를 지정하지 말고 설정 정보 클래스를 프로젝트 최상단에 두는 것을 권장하신다..!!
- 스프링 부트를 사용하면 @SpringBootApplication을 프로젝트 시작루트 위치에 두는 것이 관례인데, 이 애노테이션에 @ComponentScan이 포함되어 있다.!
✔️@Component뿐만 아니라 다음과 같은 애노테이션도 빈으로 등록해준다
- @Controller: 스프링 MVC 컨트롤러로 인식
- @Repository: 스프링 데이터 접근 계층으로 인식
- @Configuration: 스프링 설정 정보로 인식, 스프링 빈이 싱글톤을 유지하도록 추가 처리
- @Service: 특별한 부가적인 기능이 없지만 개발자들이 핵심 비지니스 로직을 여기에 넣음
✔️필터를 사용해서 스프링 빈을 등록할지, 등록하지 않을 것인지 지정할 수 있다.
예시)
@ComponentScan(
includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),},
excludeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class),}
)
컴포넌트 스캔 시 빈 이름의 충돌
1. 자동 빈 등록과 자동 빈 등록이 충돌 할 경우
-ConflicatingBeanDefinitionException 예외 발생
2. 수동빈 등록과 자동빈 등록이 충돌 할 경우
- 수동 빈 등록이 우선권을 가져서, 수동 빈이 자동 빈을 오버라이딩 함
- 하지만 다음과 같이 오류가 나겠금 설정을 바꿀 수도 있다.
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
(기본은 false)
(참고 : 인프런 김영한 강사님 - 스프링 핵심원리 - 기본편 )
'SPRING > spring 기본' 카테고리의 다른 글
[spring] 빈 생명주기 콜백 (0) | 2022.03.14 |
---|---|
[spring] 의존관계 주입 (0) | 2022.03.13 |
[spring] 싱글톤 컨테이너 (0) | 2022.03.10 |
[spring] 스프링 컨테이너와 스프링 빈 (0) | 2022.03.09 |