스프링

컴포넌트 스캔

내일도무사히 2021. 9. 1. 11:47

김영한님의 스프링 핵심 원리 - 기본편 강의를 듣고 작성했습니다.

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 개발자가 되어보세요! 📣 확인해주

www.inflearn.com


 

 

컴포넌트 스캔과 의존관계 자동 주입

 

 

 

@ComponentScan

  • @Component가 포함된 클래스들을 자동으로 스프링 컨테이너에 넣어준다.
  • 이때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.
  • 이름을 지정하고 싶으면 @Component("Service2")와 같은 방식으로 이름을 지정해주면 된다.
  • 사용할 경우 일일히 설정 정보를 @Configuration으로 지정한 설정 정보 파일에 넣어줄 필요가 없어서 반복을 피할 수 있다.

설정 정보에 @ComponentScan 붙임
서비스에 @Component를 붙이면 클래스가 스프링 컨테이너에 자동으로 등록된다

 

@Autowired

생성자나 필드, 메소드에서 스프링 컨테이너가 의존관계를 자동으로 주입해주는 기능을 제공한다.

기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.

 

 

 

컴포넌트 스캔 탐색 위치

어떠한 설정도 하지 않으면 기본적으로 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

위치를 지정하고 싶다면 다음과 같이 지정할 수 있다.

@ComponentScan(
  basePackages = "com.example.packagename"
)

 

*권장하는 방법: 패키지 위치를 따로 지정하지 않고 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이 좋다.

 

 

 

컴포넌트 스캔 기본 대상

  • @Component
  • @Controller
  • @Service
  • @Repository
  • @Configuration

@Controller등의 소스코드를 보면 @Component를 포함하고 있는 것을 볼 수 있다.

 

또한 각각의 애노테이션은 다음의 부가 기능을 수행한다

  • @Controller : 스프링 MVC 컨트롤러로 인식
  • @Repositorty: 스프링 데이터 접근 계층으로 인식, 데이터 계층의 예외를 스프링 예외로 변환시킨다.
  • @Configuration: 스프링 설정 정보로 인식, 스프링 빈이 싱글톤을 유지하도록 추가 처리
  • @Service: 특별한 처리를 하지 않으나, @Service를 붙임으로써 개발자에게 핵심 비즈니스 로직의 위치를 알 수 있게 해줌

 

 


 

필터

 

  • includeFilters : 컴포넌트 스캔 대상 추가 지정
  • excludeFilters : 컴포넌트 스캔 대상 제외

 

사용하기 위해선 애노테이션을 정의해야한다

 

IncludeFilters를 위한 애노테이션

 

excludeFilters를 위한 애노테이션

 

* 애노테이션의 설정 정보는 @Component의 애노테이션을 가져왔다

 

@Component

 

 

애노테이션을 정의한 다음에 해당 필터를 원하는 클래스에 애노테이션을 지정해준다.

 

 

 

그 뒤, ComponentScan에 값을 지정해주면 된다.

@ComponentScan(
  includeFilters = @Filter(type = FilterType.ANNOTATION, classes = [IncludeComponentTestAnnotation.class]
  excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = [ExcludeComponentTestAnnotation.class]
)

 

 


 

FilterType 옵션

  • ANNOTATION: 기본 값, 애노테이션을 인식해서 동작한다
  • ASSIGNABLE_TYTPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
  • ASPECTJ: ASPECTJ 패턴 사용
  • REGEX: 정규 표현식
  • CUSTOM: TypeFilter라는 인터페이스를 구현해서 처리