컴포넌트 스캔(Component Scan)은 스프링 프레임워크가 특정 패키지를 탐색하면서, 스캔 대상에 해당하는 클래스를 찾아 빈(Bean)으로 등록하는 기능입니다. 스프링 애플리케이션은 이러한 자동 스캔 기능 덕분에 개발자가 Bean을 매번 XML이나 자바 설정 파일에 일일이 등록하지 않아도 됩니다.
자바 기반의 설정을 예로 들면, @Configuration 클래스에 @ComponentScan 어노테이션을 작성하고 패키지를 지정하기만 하면 해당 패키지(및 하위 패키지)의 스프링 빈 등록 대상(@Component, @Service, @Repository, @Controller 등) 클래스들을 모두 스캔하여 자동으로 Bean 등록을 수행합니다.
스프링이 컴포넌트 스캔을 시작하면 크게 아래와 같은 과정을 거칩니다.
Tip: @Bean을 메서드에 붙여 빈을 등록하는 방식(수동 등록)과 @ComponentScan에 의한 자동 등록이 모두 가능하므로, 환경과 구조에 따라 적절히 병행할 수 있습니다.
자바 기반 설정을 예시로 들어 보겠습니다.
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
Java@ComponentScan(basePackages = {"com.example.service", "com.example.repository"})
Java복수의 패키지를 동시에 지정할 수 있습니다.
@Configuration
@ComponentScan
public class AppConfig { ... }
Java해당 설정 클래스의 패키지를 베이스로 스캔이 이루어집니다. 따라서 패키지 구조를 적절히 배치하고, 설정 클래스가 상위 패키지에 위치하도록 하면 자연스럽게 전체 애플리케이션이 스캔될 수 있습니다.
보다 유연하게 컴포넌트 스캔 대상을 제어하고 싶다면, includeFilters와 excludeFilters를 활용할 수 있습니다.
includeFilters는 지정된 조건(타입, 어노테이션 등)에 부합하는 클래스만 스캐닝하여 빈으로 등록합니다.
@Configuration
@ComponentScan(
basePackages = "com.example",
includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyCustomAnnotation.class)
},
useDefaultFilters = false
)
public class AppConfig {
}
JavaexcludeFilters를 사용하면 원하는 클래스(또는 어노테이션, 정규 표현식 등)를 스캔 대상에서 제외할 수 있습니다.
@Configuration
@ComponentScan(
basePackages = "com.example",
excludeFilters = {
@ComponentScan.Filter(type = FilterType.REGEX, pattern = "com\\.example\\.excluded.*")
}
)
public class AppConfig {
}
Java스프링에서 Bean은 식별자(이름)로 관리됩니다. 스캔된 클래스 이름이 동일하거나, 별도로 지정한 Bean 이름이 겹치면 충돌이 발생합니다. 예를 들어, 같은 패키지 하위에 두 개의 @Service(“orderService”)가 있다면 스캔 과정에서 이름이 충돌할 수 있습니다.
여러 개의 설정 파일(AppConfig 등)에 대해 basePackages가 겹치는 경우, 같은 클래스를 중복 스캔할 우려가 있습니다.
수많은 패키지를 한꺼번에 스캔하면 시작 속도가 느려질 수 있습니다. 대규모 프로젝트에서는 스캔 범위를 꼭 필요한 영역으로 한정하고, 불필요한 패키지는 excludeFilters 등으로 제외하여 성능을 관리할 필요가 있습니다.
스프링 부트를 사용한다면 @SpringBootApplication 에 이미 @ComponentScan이 포함되어 있기 때문에, @SpringBootApplication이 선언된 클래스의 패키지 및 하위 패키지가 기본 스캔 대상이 됩니다.
멀티 모듈 환경에서 서비스 레이어, 리포지토리 레이어 등의 프로젝트가 나뉘어 있을 경우, 각 모듈에서 제공하는 패키지 경로가 다를 수 있습니다. 이때 @ComponentScan의 basePackages에 여러 모듈의 패키지를 나열하거나, 개별 모듈 별로 설정 클래스를 분리해 적용할 수 있습니다.
@Configuration
@ComponentScan(basePackages = {
"com.example.moduleA",
"com.example.moduleB"
})
public class MultiModuleConfig {
}
Java스프링 프로파일을 활용해, 특정 환경에서만 스캔되는 빈을 관리할 수도 있습니다.
스프링 컴포넌트 스캔은 개발자가 Bean 등록을 쉽게 자동화하고, 의존성 주입(Dependency Injection)을 간편하게 설정할 수 있도록 해주는 핵심 기능입니다.
프로젝트 규모가 작을 땐 @ComponentScan(basePackages = “패키지.경로”)만 지정해도 충분하지만, 규모가 커지거나 특정 패키지는 제외해야 할 필요가 있으면 excludeFilters를 적극 활용하고, 빈 충돌을 방지하기 위해 디렉터리 구조와 빈 이름을 체계적으로 설계해야 합니다.
컴포넌트 스캔은 스프링 DI 컨테이너를 구성하는 핵심적인 방법 중 하나로, 스프링을 이용해 애플리케이션을 개발할 때 빼놓을 수 없는 핵심 기능입니다.
컴포넌트 스캔 덕분에 스프링 애플리케이션을 모듈 단위로 구조화하고, 각 계층(@Controller, @Service, @Repository 등)으로 구분해 작성하면, 큰 규모의 애플리케이션도 체계적으로 관리하고 확장할 수 있습니다. 앞으로 프로젝트에서 컴포넌트 스캔 기능을 적극 활용해 생산성과 유지보수성을 향상시키시길 바랍니다.
스프링 빈이란? 스프링 빈(Spring Bean)은 스프링 IoC(Inversion of Control) 컨테이너가 관리하는 자바 객체를 의미합니다. 간단히…
스프링 컨테이너(Spring Container)란? 스프링 컨테이너는 스프링 프레임워크에서 가장 핵심적인 부분으로, IoC(Inversion of Control) 개념을 기반으로…
Queue란 무엇인가? Java에서 Queue는 데이터 구조의 일종으로, 데이터를 선입선출(FIFO, First-In-First-Out) 방식으로 처리합니다. 이 글에서는 Queue의…
Stack이란 무엇인가? Java에서 Stack은 자료구조의 한 종류로, 데이터를 순서대로 쌓아 올리는 형태로 운영됩니다. 컴퓨터 과학에서…
소개 자바에서 Map 인터페이스는 키(Key)와 값(Value)의 쌍을 저장하는 자료구조입니다. 이는 연관 배열이라고도 불리며, 각 키는…
소개 자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번…