컴포넌트 검색(Component Scan)을 수행하는 방법은 다음 3가지가 있습니다.
- 빈 스캐너를 내장한 어플리케이션 컨텍스트를 사용하는 방법
- XML을 이용한 빈 스캐너 등록: `<context:component-scan>`
- `@ComponentScan` 어노테이션 사용하여 검색 대상 패키지를 지정하는 방법
이번 포스팅에서는 자바 코드 설정을 이용한 방법인 `@ComponentScan`에 대해 설명하겠습니다.
@ComponentScan
`@ComponentScan` 어노테이션을 사용하면 Spring을 지정된 패키지와 패키지의 하위 패키지를 스캔하여 @Component 어노테이션이 적용된 클래스를 찾아 빈으로 등록해줍니다.
@Configuration
@ComponentScan("패키지 경로")
public class AppConfig{
}
@ComponentScan 속성
basePackageClasses
@Configuration
@ComponentScan(basePackageClasses=ServiceMarker.class)
public class AppConfig{
}
@ComponentScan 어노테이션의 basePackageClasses 속성은 패키지 대신 특정 클래스를 기준으로 컴포넌트 스캔을 수행하는 데 사용됩니다.
basePackageClasses 속성은 패키지 이름을 지정하는 대신 특정 클래스를 기준으로 스캔할 때 유용합니다. 예를 들어, 특정 패키지의 모든 컴포넌트 대신에 특정 클래스가 속한 패키지의 컴포넌트만 스캔하고 싶은 경우에 사용할 수 있습니다. 예를 들어, basePackageClasses = {MyClass1.class, MyClass2.class}와 같이 사용될 수 있습니다.
basePackages와 basePackageClasses를 동시에 지정하는 것도 가능합니다. 이 경우, 지정된 패키지와 클래스의 패키지를 모두 스캔하여 컴포넌트를 찾습니다.
excludeFilters
`excludeFilters` 속성을 통해 일부 컴포넌트를 스캔 대상에서 제외할 수 있습니다. 해당 속성은 FilterType을 기반으로 동작하고 다음과 같이 작성하면 됩니다.
@Configuration
@ComponentScan(basePackages = {"myproject", "myproject2" },
excludeFilters = @Filter(type = FilterType.ANNOTATION,
classes = {Repository.class, Service.class}))
public class AppConfig{
}
- FilterType.ANNOTATION: 특정 어노테이션을 가진 컴포넌트를 제외합니다.
@ComponentScan(excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyAnnotation.class))와 같이 사용하여 MyAnnotation 어노테이션이 적용된 컴포넌트를 제외할 수 있습니다. - FilterType.ASSIGNABLE_TYPE: 특정 타입 또는 하위 타입을 가진 컴포넌트를 제외합니다.
@ComponentScan(excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyComponent.class))와 같이 사용하여 MyComponent 클래스를 상속하거나 구현한 컴포넌트를 제외할 수 있습니다. - FilterType.REGEX: 정규식을 사용하여 패키지 또는 클래스 이름에 일치하는 컴포넌트를 제외합니다.
@ComponentScan(excludeFilters = @Filter(type = FilterType.REGEX, pattern = "com\.example\..*"))와 같이 사용하여 "com.example" 패키지와 그 하위 패키지에 속하는 컴포넌트를 제외할 수 있습니다. - FilterType.CUSTOM: 커스텀 필터를 구현하여 특정 조건에 맞는 컴포넌트를 제외합니다.
@ComponentScan(excludeFilters = @Filter(type = FilterType.CUSTOM, classes = MyCustomFilter.class))와 같이 사용하여 MyCustomFilter 클래스에서 정의한 커스텀 필터를 사용하여 컴포넌트를 제외할 수 있습니다.
@Import
@Import 어노테이션은 다른 설정 클래스나 구성 클래스를 현재의 설정 클래스로 가져오는데 사용됩니다.
이를 통해 외부 설정 클래스를 현재 설정에 포함시킬 수 있어, 여러 설정 파일을 한 곳에서 관리하거나 모듈화된 설정을 구성할 수 있습니다.
@Configuration가 부여된 현재 설정 클래스인 AppConfig에서 AnotherConfig 클래스를 다음과 같이 가져올 수 있습니다.
@Configuration
@Import(AnotherConfig.class)
public class AppConfig{
}
@Configuration
public class AnotherConfig{
}
설정 클래스를 배열로 여러 개를 가져오거나 별칭을 주는 것도 가능합니다.
// 여러 설정 파일 가져오기
@Configuration
@Import({Config.class, AnotherConfig.class})
public class AppConfig{
}
// 별칭 주기
@Configuration
@Import(value = {Config.class, AnotherConfig.class}, name = {"config", "anotherConfig"})
public class AppConfig{
}
하나의 어플리케이션 컨텍스트가 사용할 설정 클래스가 여러 개라면 모든 클래스를 컨텍스트에 직접 등록하는 대신 기준이 되는 @Configuration 설정 클래스 파일 하나만 컨텍스트에 등록하고, 이 클래스에서 다른 부가적인 빈 설정을 담은 @Configuration 설정 클래스를 @Import하는 방법으로 가독성을 높일 수 있습니다.
`@Enable`로 시작하는 어노테이션
`@Enable`로 시작하는 어노테이션들은 주로 특정한 기능이나 기능 집합을 활성화하는 데 사용되는 어노테이션입니다.
이러한 어노테이션들은 일반적으로 구성 클래스(Java Configuration Class)에 적용되며, 해당 기능을 사용할 수 있도록 Spring에 지시합니다.
`@Enable` 어노테이션 예시
- @EnableAutoConfiguration
이 어노테이션은 Spring Boot 애플리케이션에서 사용되며, 자동 구성(auto-configuration) 기능을 활성화합니다. 자동 구성은 클래스 패스와 기타 조건을 기반으로 애플리케이션을 자동으로 구성하는 기능을 제공합니다. - @EnableTransactionManagement
이 어노테이션은 Spring의 트랜잭션 관리 기능을 활성화합니다. 트랜잭션 관리는 애플리케이션에서 데이터베이스 트랜잭션을 처리하고 제어하는 데 사용됩니다. @EnableTransactionManagement을 사용하면 @Transactional 어노테이션을 사용하여 메서드에 트랜잭션을 적용할 수 있습니다. - @EnableCaching
이 어노테이션은 Spring의 캐싱 기능을 활성화합니다. 캐싱은 애플리케이션에서 자주 사용되는 데이터나 결과를 메모리에 저장하여 성능을 향상시키는 기능을 제공합니다. @EnableCaching을 사용하면 @Cacheable, @CacheEvict 등의 캐시 관련 어노테이션을 사용할 수 있습니다. - @EnableScheduling
이 어노테이션은 Spring의 스케줄링 기능을 활성화합니다. 스케줄링은 애플리케이션에서 정기적으로 실행되는 작업을 예약하고 처리하는 기능을 제공합니다. @EnableScheduling을 사용하면 @Scheduled 어노테이션을 사용하여 메서드를 예약된 작업으로 설정할 수 있습니다. - @EnableWebMvc
이 어노테이션은 Spring MVC 웹 애플리케이션에서 MVC 기능을 활성화합니다. MVC 기능은 웹 요청을 처리하고 응답을 생성하는 데 사용됩니다. @EnableWebMvc를 사용하면 컨트롤러, 뷰 리졸버, 인터셉터 등과 같은 MVC 관련 빈을 설정할 수 있습니다.
이 외에도 "@Enable"로 시작하는 다양한 어노테이션이 있으며, 각각의 어노테이션은 특정한 기능을 활성화하는 데 사용됩니다. 이러한 어노테이션들은 Spring의 기능을 선택적으로 사용하고 구성하는 데 도움을 줍니다.
💡XML의 전용 태그 대체할 수 있는 어노테이션들
- @EnableTransactionManagement
- @EnableAspectJAutoProxy
- @EnableAsync
- @EnableCaching
- @EnableLoadTimeWeaving
- @EnableScheduling
- @EnableSpringConfigured
- @EnableWebMvc
'Spring Framework' 카테고리의 다른 글
Spring 스프링 JDBC (feat. JdbcTemplate) (0) | 2022.08.26 |
---|---|
Spring 프로퍼티 파일 ( .properties, .yaml), 프로파일(profiles) (0) | 2022.08.25 |
Spring 빈 생명주기( Bean Life Cycle ) (0) | 2022.08.24 |
Spring 빈 스코프 ( Bean Scope ) (0) | 2022.08.23 |
Spring @Autowried: 의존 관계 자동 주입 (0) | 2022.08.21 |