Peony의 기록 창고 🌼
article thumbnail
반응형

지금까지 만든 Appconfig를 보면 @Bean 어노테이션을 붙여서 직접 설정정보에 스프링 빈을 나열하는 형식이었다.

그런데, 내가 만들어야할 스프링 빈이 수백개가 된다면 ?

@ComponentScan을 사용 !

 

동작 과정

1. @ComponentScan

  • @Component 어노테이션이 붙은 모든 클래스를 자동으로 스프링 빈에 등록해준다.
  • 이때, 스프링 빈의 기본 이름 : 클래스명 사용, 앞글자만 소문자를 사용한다.
    • MemberServiceImpl 클래스 → Bean 이름 : memberServiceImpl
    • 만약, 클래스에 @Component(“service”)처럼 속성을 설정하면?
      → service 라는 이름으로 등록된다.

 

2. @Autowired 의존 관계 자동 주입

  • 생성자에 @Autowired 어노테이션을 지정하면, 자동으로 해당 스프링 빈을 찾아 등록해준다.
  • (= ac.getBean(beanName, beanClass)

 

탐색 위치와 기본 스캔 대상

모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸리기 때문에 꼭 필요한 위치부터 탐색하도록 시작

위치를 지정할 수 있다.

@ComponentScan(
          basePackages = "hello.core",
}
  • 지정하지 않으면 @ComponentScan 어노테이션이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

 

개인적으로 즐겨 사용하는 방법은 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 최근 스프링 부트도 이 방법을 기본으로 제공한다.

 

컴포넌트 스캔 기본 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controlller
    • 스프링 MVC 컨트롤러에서 사용
    • 스프링 MVC 컨트롤러로 인식
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository
    • 스프링 데이터 접근 계층에서 사용
    • 데이터 계층의 예외를 스프링 예외로 변환
  • @Configuration
    • 스프링 설정 정보에서 사용
    • 스프링 빈이 싱글톤을 유지하도록 추가 처리

 

필터

  • includeFilters : 컴포넌트 스캔 대상을 추가로 지정
  • excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정

 

필터 Type 옵션

  • ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
    ex) org.example.SomeAnnotation
  • ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
    ex) org.example.SomeClass
  • ASPECTJ: AspectJ 패턴 사용
    ex) org.example..*Service+
  • REGEX: 정규 표현식
    ex) org.example.Default.*
  • CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
    ex) org.example.MyTypeFilter

 

참고: includeFilters 를 사용할 일은 거의 없다. excludeFilters 는 여러가지 이유로 간혹 사용할 때가 있지만 많지는 않다.

 

특히 최근 스프링 부트는 컴포넌트 스캔을 기본으로 제공하는데, 개인적으로는 옵션을 변경하면서 사용하기 보다는 스프링의 기본 설정에 최대한 맞추어 사용하는 것을 권장하고, 선호하는 편이다.

 

중복 등록과 충돌

컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까? 다음 두가지 상황이 있다.

 

자동 빈 등록 vs 자동 빈 등록

ConflictingBeanDefinitionException 예외 발생

 

수동 빈 등록 vs 자동 빈 등록

❓만약 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌되면 어떻게 될까?

 

이 경우 수동 빈 등록이 우선권을 가진다.

하지만, 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.

 

이 글은 김영한님의 "스프링 핵심 원리 - 기본편" 강의를 듣고 정리한 내용입니다.

반응형
profile

Peony의 기록 창고 🌼

@myeongju