[Spring] 컴포넌트 스캔

Seongho·2023년 1월 29일
0

Spring

목록 보기
7/13

컴포넌트 스캔


이렇게 스프링 빈을 @Bean을 통해서 직접 등록하는 방법도 있지만, 만약 등록해야 할 빈이 수백개가 된다면, 설정 정보도 커지고, 관리하기가 힘들어진다.
스프링은 이러한 문제를 해결하기 위하여 빈을 자동으로 등록해주는 컴포넌트 스캔 기능과 의존관계 자동 주입 기능을 제공한다.

@ComponentScan

@Configuration이 붙은 자바 설정 파일에 @ComponentScan을 추가한다.

@Configuration
@ComponentScan()
public class AutoAppConfig {
//
}

컴포넌트 스캔은 @Configuration이 있는 클래스를 포함하여 @Component가 있는 클래스를 스캔하여 생성자를 호출해 스프링 빈으로 등록한다. 기존에 @Bean으로 등록한 클래스에 @Component를 붙여주면 된다.
컴포넌트 스캔은

@ComponentScan(
 	basePackages = "hello.core",
}

와 같이 탐색할 시작 패키지를 지정할 수 있다. 만약 지정하지 않으면 디폴트로 @ComponentScan이 붙은 자바 설정 클래스의 패키지가 시작 위치가 된다. 따라서, basePackages를 지정하지 않고 자바 설정 클래스를 프로젝트 최상단 패키지 안에 넣는 것이 편하다.
스프링 부트의 경우, @SpringBootApplication(@ComponentScan 포함되어있음)가 있는 클래스를 프로젝트 최상단 패키지 않에 넣는 것이 국룰이다.
**참고로, @Configuration이 있는 자바 설정 클래스도 빈으로 등록하는 이유는 @Configuration 소스코드 안에 @Component가 포함되어 있기 때문이다.

@ComponentScan의 세부 동작

@ComponentScan은 @Component가 붙은 클래스를 스캔하면서 클래스명에서 맨 앞글자만 소문자로 바꾸어 빈 이름을 지정하여 등록한다.
ex) OrderServiceImpl -> orderServiceImpl
빈 이름을 직접 지정하고싶으면 @Component("빈 이름") 이렇게 설정하면 된다.
이 때, 생성자에 @Autowired가 붙어있으면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 의존관계를 주입한다. 이때, 컨테이너가 스프링 빈을 조회하는 방법은 타입이 같은 빈을 찾는 것이다.
ex)

위 사진에서 orderServiceImpl 빈을 만들고 MemoryMemberRepository(MemberRepository의 구현 클래스)와 RateDiscountPolicy(DiscountPolicy의 구현 클래스) 타입의 빈을 찾아 의존관계를 주입한다.

컴포넌트 스캔 대상

@Component : 컴포넌트 스캔에서 사용
@Controlller : 스프링 MVC 컨트롤러에서 사용
@Service : 스프링 비즈니스 로직에서 사용
@Repository : 스프링 데이터 접근 계층에서 사용
@Configuration : 스프링 설정 정보에서 사용
**모두 내부 코드에 @Component를 포함하고 있다. 참고로, 어떤 애너테이션 안에 어떤 애너테이션이 있는지는 자바의 기능이 아니라 스프링의 기능이다.

컴포넌트 스캔 대상 포함, 제외

@Configuration
@ComponentScan(
 	includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
 	excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
 )
  • includeFilters : 컴포넌트 스캔 대상 포함
  • excludeFilters : 컴포넌트 스캔 대상 제외

빈 중복 등록

  • 자동 빈 등록 VS 자동 빈 등록 : @Component가 붙은 클래스의 이름을 같게 설정한 경우로, 스프링에서 ConflictingBeanDefinitionException 예외를 발생시킨다.
  • 수동 빈 등록 VS 자동 빈 등록 : 수동으로 이름을 지정한 경우에는 수동으로 지정한 수동으로 지정한 빈 객체가 자동으로 등록된 빈 객체를 오버라이딩해버린다.

그런데

수동 등록을 함으로써 버그를 잡기 힘들어진다.
그냥 수동 빈 등록 쓰지 말기.
애매한 이득을 챙기려다 큰 버그를 만들지 말자

profile
Record What I Learned

0개의 댓글