둘셋 개발!

[spring] 컴포넌트 스캔 본문

SPRING/spring 기본

[spring] 컴포넌트 스캔

23 2022. 3. 13. 13:23

스프링 빈을 등록할 때 @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