개요
멀티 모듈 MSA 프로젝트를 진행하던 중, Security 기능을 하나의 모듈로 분리하였으나, 이 Security 모듈의 빈들이 등록되지 않아 에러가 발생했습니다.
이를 해결하기 위해 @ComponentScan 어노테이션을 사용하여 Security 모듈의 빈들을 등록할 수 있도록 지정했습니다.
@ComponentScan에 대해 알고는 있었지만, 이번 기회를 통해 @Component 어노테이션에 대해 더 깊이 알아보고자 합니다.
@ComponentScan이란❓
@ComponentScan은 Spring Framework에서 컴포넌트 클래스들을 자동으로 탐색하고 빈으로 등록하는 데 사용되는 어노테이션입니다.
Spring 애플리케이션에서는 다양한 클래스들이 빈(Bean)으로 등록되어야 의존성 주입(Dependency Injection)과 같은 기능을 사용할 수 있는데, 이 과정을 수동으로 설정하는 것은 비효율적입니다.
@ComponentScan을 사용하면 Spring이 자동으로 특정 패키지 이하의 클래스들을 스캔하고, 적절한 빈으로 등록해줍니다.
@ComponentScan의 역할
Spring에서 애플리케이션은 주로 여러 계층(Controller, Service, Repository 등)으로 구성되며, 이러한 계층의 클래스들은 @Component, @Service, @Repository, @Controller와 같은 어노테이션으로 마킹됩니다.
@ComponentScan은 이러한 애너테이션이 붙은 클래스를 자동으로 감지하고, 빈으로 등록하는 작업을 수행합니다.
@ComponentScan 사용 방법
기본 사용
@Configuration
@ComponentScan(basePackages = "com.example.project")
public class AppConfig {
}
@ComponentScan은 보통 @Configuration이나 @SpringBootApplication 클래스 위에 선언되며, 특정 패키지 또는 그 하위 패키지들을 스캔하도록 설정됩니다.
위 코드는 com.example.project 패키지와 그 하위 패키지에서 @Component 어노테이션이 붙은 클래스들을 자동으로 탐색하여 Spring 컨테이너에 빈으로 등록하는 예시입니다.
basePackages 속성
@ComponentScan(basePackages = {"com.example.project.service", "com.example.project.repository"})
basePackages 속성은 스캔할 패키지를 지정하는 데 사용됩니다. 여러 패키지를 스캔하고자 할 때는 배열 형식으로 지정할 수 있습니다.
basePackageClasses 속성
@ComponentScan(basePackageClasses = {MyService.class, MyRepository.class})
basePackageClasses 속성은 패키지 경로 대신 특정 클래스들을 기준으로 그 클래스가 속한 패키지와 하위 패키지를 스캔할 수 있습니다
위 코드는 MyService와 MyRepository 클래스가 속한 패키지들을 기준으로 컴포넌트를 스캔합니다.
@ComponentScan 의 주요 속성
basePackages
- 스캔할 패키지 경로를 지정합니다.
- 경로는 문자열로 설정하며, 여러 개를 지정할 수 있습니다.
basePackageClasses
- 특정 클래스들을 기준으로 스캔할 패키지를 결정합니다.
- 클래스는 그 클래스가 속한 패키지와 하위 패키지를 스캔하는 기준이 됩니다.
excludeFilters
- 특정 클래스를 스캔 대상에서 제외하고자 할 때 사용합니다.
- @ComponentScan.Filter를 통해 클래스를 제외할 수 있습니다.
includeFilters
- 특정 조건에 맞는 클래스들만 스캔하고자 할 때 사용합니다.
lazyInit
- true로 설정하면 빈이 실제로 사용될 때까지
초기화되지 않도록 설정할 수 있습니다.
Filter를 이용한 스캔 제외/포함
@ComponentScan(
basePackages = "com.example.project",
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Controller.class)
)
public class AppConfig {
}
위 코드는 com.example.project 패키지 이하에서 @Controller 애너테이션이 붙은 클래스를 스캔 대상에서 제외합니다.
Spring boot에서 @ComponentScan
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Spring Boot에서는 @SpringBootApplication 어노테이션이 이미 @ComponentScan을 포함하고 있으므로 별도로 선언할 필요는 없습니다.
@SpringBootApplication이 선언된 클래스가 속한 패키지와 그 하위 패키지가 기본 스캔 대상이 됩니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.1010 - RestTemplate HTTP 요청 메서드 (0) | 2024.10.10 |
---|---|
[TIL, 일일 회고] 2024.10.09 - @Positive, @PositiveOrZero (0) | 2024.10.09 |
[TIL, 일일 회고] 2024.10.07 - @ModelAttribute가 자동 변환 할 수 없는 타입 (0) | 2024.10.07 |
[TIL, 일일 회고] 2024.10.06 - AWS S3 요청 객체 (1) | 2024.10.06 |
[TIL, 일일 회고] 2024.10.05 - @Test 어노테이션이란❓ (0) | 2024.10.05 |