본문 바로가기
[Spring]/Annotation

컴포넌트 스캔(@ComponentScan)과 @Autowired

by 황원용 2023. 3. 5.
728x90

@ComponentScan

  • @Component 애너테이션이 붙은 클래스를 자동으로 스캔하고 스프링 빈을 등록해 준다.
    • @Component("이름") 이런 식으로 빈 이름을 지정할 수 있다.
  • @Service, @Repository, @Controller, @Configuration이 붙은 설정 정보도 자동으로 등록된다.
    • 이 애너테이션들이 컴포넌트 스캔의 대상이 되는 이유는 전부 소스 코드를 열어보면 @Component 애너테이션이 붙어있기 때문이다.
  • includeFilters, excludeFilters를 이용하면 일부 설정 정보를 컴포넌트 스캔 대상에서 추가, 제외할 수 있다.

 

@Autowired 

  • 의존관계를 자동으로 주입해 준다.
  • 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입한다.
  • 생성자에 파라미터 수와 상관없이 여러 의존관계를 한 번에 주입받을 수 있다.

 

 

컴포넌트 스캔의 스캔 대상

basePackages

  • ex) @ComponentScan(basePackages = {"hello.core", "hello.service"}) 
  • 탐색할 패키지의 시작 위치를 지정할 수 있으며, 해당 패키지를 포함해 하위 패키지를 모두 탐색한다.

그러나, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 방법이 가장 깔끔하다.

  • 스프링 부트도 이 방법을 기본으로 제공한다.
  • 스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication을 프로젝트의 시작 루트 위치에 두는 것이 관례이다.
  • 이 설정 안에 @ComponentScan이 들어있다.

 

 

컴포넌트 스캔 기본 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controller : 스프링 MVC 컨트롤러에서 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용
  • @Configuration : 스프링 설정 정보에서 사용

 

 

애너테이션의 상속관계

  • 애너테이션은 상속관계가 없다. 애너테이션이 특정 애너테이션을 들고 있는 것을 인식하는 건 자바의 기능이 아닌, 스프링의 기능이다.

 

 

스프링 빈의 중복 등록과 충돌

자동으로 등록된 빈 간의 충돌

  • ConflictingBeanDefinitionException 예외 발생

수동으로 등록된 빈과 자동으로 등록된 빈 간의 충돌

  • 역시 오류가 발생한다.
  • application.yml에 spring.main.allow-bean-definition-overriding=true를 넣어줌으로 수동이 우선권을 가지게 할 수 있다.(비추) 

 

 

 

참고

김영한 - 스프링 핵심 이론

728x90