개발 공부 중!/Spring

[스프링5 입문] Chap 05. 컴포넌트 스캔

김evelyn 2024. 1. 6. 18:23

📚 @Component 애노테이션

 

스프링이 검색해서 빈으로 등록이 가능하려면 클래스에 @Component 애노테이션을 붙여야 한다. @Component 애노테이션은 해당 클래스를 스캔 대상으로 표시한다.

@Component
public class MemberDao {
...
}

 

위 경우에는 Component 애노테이션에 값을 주지 않았다. 이 경우 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 애노테이션으로 사용한다. (memberDao)

@Component("infoPrinter")
public class MemberInfoPrinter {
...
}

 

위 경우는 Component 애노테이션에 값을 주었다. 클래스 이름은 MemberInfoPrinter이지만 빈 이름으로 “infoPrinter”를 사용한다.

 

 

📚 @ComponentScan 애노테이션

 

@Configuration
@ComponentScan(basePackages = {"spring"})
public class AppCtx {
...
}

 

위 경우의 @ComponentScan 애노테이션의 “basePackages” 속성값은 {”spring”}이다.

  • basePackages란? 스캔 대상 패키지 목록을 지정하는 속성

@ComponentScan 애노테이션은 스캔 대상에 해당하는 클래스 중, @Component 애노테이션이 붙은 클래스의 객체를 생성해서 빈으로 등록한다.

 


📚 스캔 대상에서 제외하거나 포함하는 방법

 

1. 스캔 대상에서 제외하기

  • excludeFilters 속성을 사용해 제외 대상을 지정할 수 있다. 

 

1-1. REGEX를 사용해 제외 대상을 지정할 때

@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters =@Filter(type= FilterType.REGEX, pattern = "spring//..*Dao"))
public class AppCtxWithExclude {
...
}

 

위 @Filter 애노테이션의

  • type 속성값 : FilterType.REGEX
    • 이는 정규표현식(REGEX)를 사용해 제외 대상을 지정한다는 것을 의미한다.
  • pattern 속성 : FilterType에 적용할 것을 설정
    • 위 설정에서는 “spring.”으로 시작하고 Dao로 끝나는 정규 표현식을 지정했다. (그러므로 spring.MemberDao를 컴포넌트 스캔 대상에서 제외한다.)

 

1-2. ASPECTJ를 사용해 제외 대상을 지정할 때

@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters =@Filter(type= FilterType.ASPECTJ, pattern = "spring.*Dao"))
public class AppCtxWithExclude {
...
}

 

위 @Filter 애노테이션의

  • type 속성값 : FilterType.ASPECTJ
    • AspectJ 패턴은 이후 더 자세히 살펴볼 예정이다.
    • 위 설정에서는 spring 패키지의 Dao로 끝나는 타입을 컴포넌트 스캔 대상에서 제외한다.

 

1-3. ANNOTATION을 사용해 제외 대상을 지정할 때

@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters =@Filter(type= FilterType.ANNOTATION, classes = {NoProduct.class, ManualBean.class}))

public class AppCtxWithExclude {
...
}

 

위 @Filter 애노테이션의

  • type 속성값 : FilterType.ANNOTATION
    • classes 속성에 필터로 사용할 애노테이션 타입을 값으로 준다.
    • 위 설정에서는 @NoProduct 나 @ManualBean 애노테이션을 붙인 클래스는 컴포넌트 스캔 대상에서 제외

 

 

1-4. 두 개 이상의 필터를 설정할 때

@Configuration
@ComponentScan(basePackages = {"spring"},
excludeFilters = {
	@Filter(type= FilterType.REGEX, pattern = "spring//..*Dao"), 
	@Filter(type= FilterType.ANNOTATION, classes = ManualBean.class)
})
public class AppCtxWithExclude {
...
}

 

두 개 이상의 필터를 설정하고 싶다면, 위처럼 excludeFilters 속성에 배열을 사용해 @Filter 목록을 전달하면 된다.

 

 

2. 스캔 대상에 포함하기

  • 아래 애노테이션을 붙인 클래스는 컴포넌트 스캔 대상에 포함된다.
  • @Component
  • @Controller
  • @Service
  • @Repository
  • @Aspect
  • @Configuration