ComponentScan

Single Ko·2023년 4월 18일
0

Spring 강의 정리

목록 보기
4/31

@ComponentScan 등장.

자바코드의 @Bean 이나 XML의 <bean>을 통해서 의존관계를 주입할때 객체가 수십, 수백개라면? -> 일일이 Bean등록 하기 귀찮고 시간이 걸림. 실수로 Bean 등록을 안할 수도 있음.

이때 @ComponentScan이 있다. @Bean이 빌요없고, @Component를 상속받고 있기때문에 @Configuration을 붙인 클래스도 자동적으로 등록해준다.

(excludeFilter ="java.package") => 스캔의 대상 제외.

@Component를 붙이면 의존관계를 어떻게 주입할것인가?

  • @Autowired (자동 의존관계 주입). -> 이때 생성자가 하나만 있다면 @Componet가 붙은 클래스는 자동적으로 Autowired를 붙여주기때문에 @Autowired를 생략해도 된다.

Spring의 애노테이션들

  • @ComponentScan은 @Component가 붙은 모든 클래스를 빈으로 등록한다.
    '빈이름 기본전략' => 클래스의 이름명을 첫글자만 소문자로해서 등록시켜준다. 빈 이름을 바꾸고싶다면 따로 이름을 적어주면 된다.
    @Bean(name ="바꾸고 싶은 이름")

  • @Autowired를 지정하면 스프링컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다. 기본 전략은 타입이 같은 빈을 조회해서 주입해준다. ex)getBean(MemeberRepository.class)

  • @ComponentScan의 탐색할 패키지의 시작위치 지정도 가능. 모든 자바클래스를 다 컴포넌트 스캔하면 시간이 오래걸림. basePackage를 사용하면 된다. 지정된 패키지의 하위패키지를 다 뒤진다.
    => 요즘에는 basePackage를 사용하지 않아도 된다. @ComponentScan이 붙은 설정 정보 클래스가 시작위치가 된다 스프링부트도 이 방법을 기본으로 제공한다.

  • @SpringBootApplication => 스프링 부트를 쓰면 ComponentScan도 쓸 필요가 없다. 저 스프링부트 어플리케이션이 컴포넌트 스캔을 대상으로 받고있기때문에. 알아서 다 해줌.

  • @Controller @Service @Repository @Configuration => 역할에 따라 이름을 붙인 Component라고 보면 된다. 각자 명칭에따라 조금더 도움이 되는 부가 기능이 지원되긴 한다.

참고!! -> 애노테이션에는 상속관계라는것이 없다. 애노테이션이 특정 애노테이션을 들고 있는것을 인식 할 수 있는것은 자바가 지원하는것이 아니라 스프링이 지원하는 기능.

Filter => Excludefilter 와 Include 필터.

FilterType => Annotation (기본) , 1 Assignable type - 지정한 타입과 자식타입만 인식. 2 ASPECTJ -Asepctj 패턴 사용. REGEX -정규 표현식, CUSTOM - >TypeFilter라는 인터페이스 구현.

중복등록과 충돌

  • 자동 빈 등록 vs 자동 빈 등록 -> BeanDefinitionStoreException 발생.
  • 수동 빈 등록 vs 자동 빈 등록 -> 수동 등록 빈이 우선권을 가진다. (*수동빈이 자동 빈을 오버라이딩 해버린다) => 문제는 의도하지 않았을때 발생한다면? 애매한 버그가 생긴다.
    -> 스프링 부트를 통해서 실행한다면? 기본 설정을 바꿔서 수동 빈과 자동 빈의 이름이 같다면 오류를 내버리도록 바꾸었다. (이것은 properties의 기본 설정으로 바꿀 수 있다고 알려줌.)

** 스프링의 가장 큰 기본 명제. 항상 자동보다는 수동, 큰 개념보다는 명확한 개념을 우선순위로 둔다!!

참고 : 본 글은 김영한님의 스프링 강의를 정리한 것이다.

profile
공부 정리 블로그

0개의 댓글