2022. 10. 2. 23:22ㆍSpring
컴포넌트 스캔
지금까지 스프링 빈을 등록할 때는 자바의 코드의 @Bean 어노테이션을 사용해서 설정 정보에 직접 등록할 스프링 빈을 나열했다.
등록할 스프링 빈이 적다면 괜찮겠지만, 많으면 상당히 번거롭다.
그래서 스프링에서는 @ComponentScan이라는 기능을 제공한다.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
@ComponentScan은 @Component가 붙은 클래스를 스캔해서 자동으로 스프링 빈으로 등록시켜준다.
그렇다면 탐색 위치와 기본 스캔 대상은 어떻게 될까??
탐색 위치
@ComponentScan에는 basePackages라는 속성이 있는데 이는 탐색할 패키지의 시작 위치를 지정한다.
default값은 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
일반적으로 권장하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다.
기본 스캔 대상
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러로 인식
- @Service : 스프링 비즈니스 로직에서 사용(특별한 처리는 하지 않는데, 개발자들이 핵심 비즈니스 로직이 인지하는 데 도움이 된다.) → transactoin 처리
- @Repository : 스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환해준다.
컴포넌트 스캔 시 주의할 점
스프링 빈은 수동 등록할 수도 있고 자동 등록할 수도 있다.
참고) 수동 등록 방법
@Component(name=”service”)
만약, 수동 등록 빈과 자동 등록 빈이 충돌한다면 ConflictingBeanDefinitionException 예외가 발생한다.(빈의 이름이 같을 때)
따라서, 빈의 이름을 만들 때 주의해야한다.
가급적이면 빈을 수동 등록하지말고, 자동 등록으로만 사용하자!
여기서 의문?
본래 자바의 코드의 @Bean 어노테이션을 사용해서 설정 정보에 직접 등록할 스프링 빈을 나열할 때는 자바의 코드에서 의존관계를 설정해줬는데 AutoAppConfig 클래스는 비어있다.
그래서, 스프링에서는 의존관계를 자동으로 주입하는 @Autowired라는 기능을 제공한다.
@Autowired
생성자에 @Autowired를 지정하는 방법을 사용한다.
스프링 컨테이너가 @Component를 사용하여 빈을 등록하면 자동으로 생성자가 호출되게 되고, 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다.
이때 기본 조회 전략을 타입이 같은 빈을 주입한다.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired // ac.getBean(MemberRepository.class)의 기능과 같다 + a
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
이상입니다.
이 글은 스프링 핵심원리 - 기본편 (김영한님)의 강의를 바탕으로 정리한 글입니다.
'Spring' 카테고리의 다른 글
Postman사용 방법 (0) | 2022.10.10 |
---|---|
Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDateTime' for property 'localDateTime' 에러 해결 (0) | 2022.10.07 |
[김영한님 - 스프링의 핵심원리] 싱글톤 컨테이너 (0) | 2022.10.01 |
Springboot test @Transactional rollback is not working (0) | 2022.09.26 |
[김영한님 - 스프링의 핵심원리] Spring - 스프링이 필요한 이유(2) (0) | 2022.09.19 |