[Java] @ComponentScan, @Component @Bean

전재준·2022년 1월 15일
0

Java

목록 보기
12/15

스프링 빈을 등록할 때 수동으로 등록 하는 방법도 있지만 그렇게 되면 일일이 등록하기 귀찮고 설정 정보도 커지고 누락하는 문제도 발생하게 된다.

그래서 스프링은 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.

수동 스프링 빈 등록

자동 스프링 빈 등록

컴포넌트 스캔을 사용하려면 위 사진과 같이 @ComponentScan을 설정 정보에 붙여주면 된다.

기본 수동 스프링 빈 등록이랑 다르게 @Bean으로 등록한 클래스가 없다.

그러면 해당 주입 설정 정보가 없으면 어떻게 주입이 되는가?

컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스트를 스캔해서 스프링 빈으로 등록한다.

여태 생성자로 통한 주입을 진행했는데 더 이상 외부에서 생성자에 주입해주는 설정이 없다.

그래서 이제는 의존관계 주입도 클래스 안에서 해결을 해줘야 한다. @Autowired 를 사용해 의존관계를 자동으로 주입해준다.

@Autowired 를 사용하면 생성자에서 여러 의존관계도 한번에 주입받을 수 있다.

정리 해보자면

  • @ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
  • 이떄 스프링 빈의 등록되는 기본 빈이름은 클래스명을 사용하되 맨 앞글자만 소문자로 바꾼다 MemberServiceImpl -> memberServiceImpl
  • @Autowired 를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
  • 이떄 기본 조회 전력은 타입이 같은 빈을 찾아서 주입한다.

  • basePackages : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위패키지를 모두 탐색함

  • basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다

  • 권장하는 방법 : 기본적으로 설정파일은 패키지 최상위 위치에 두고 사용하는것을 권장한다. 최근 스프링부트도 이 방법을 기본으로 제공한다.

기본적인 @Component를 제외하고도 스캔 대상

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

-includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.

-excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.


자동빈등록 vs 자동빈등록

스프링이 자동으로 빈을 스캔해서 등록하는데 똑같은 이름이 두개가 있으면 ConflictingBeanDefinitionException 예외가 발생한다.

수동빈등록 vs 자동빈등록

직접만든 빈이랑 자동으로 스캔해서 만들어진 빈이 중복이 나면 수동 빈이 우선권을 가져서 오버라이딩 해버린다.

하지만 이러한 경우에는 잡기 어려운 버그가 만들어진다. 그래서 최근 스프링 부트에는 이런 경우에 오류가 발생하도록 기본 값을 바꾸었다.

spring.main.allow-bean-definition-overriding=true 설정파일에 해당 옵션을 통해 활성화 시킬 수 있음.


참고자료

0개의 댓글

관련 채용 정보