본문 바로가기

Spring

[Spring] Spring Bean 어떻게 등록될까?

 


 

간단하게 Bean이란?

Spring IoC 컨테이너에 의해 관리되는 객체를 말합니다. 즉, 개발자가 직접 객체를 생성하거나 관리하지 않고, Spring이 대신 객체를 생성하고 생명주기를 관리합니다.

 

 

❓Bean이 IoC 컨테이너에의해 등록되는 방법 : `ComponentScan`을 통해!

 


 

@ComponentScan

Spring이 특정 패키지 내에서 `@Component` Annotaion이 붙은 클래스를 자동으로 검색하고, 이를 Spring IoC 컨테이너에 Bean으로 등록하는 기능입니다. 개발자가 Bean을 직접 등록하지 않고도 Spring이 자동으로 관리할 객체들을 찾습니다.

 

더보기

@ComponentScan 위치

  • SpringBoot로 프로젝트를 생성하면, `main()` 메서드가 있는 클래스 상단에
    `@SpringBootApplication` Annotaion이 존재합니다.

 

  • `@SpringBootApplication`안 에 `@ComponentScan`이 존재합니다.

 


 

@ComponentScan 기본 사용 예

@Configuration
@ComponentScan(basePackages = "com.example.myapp")
public class AppConfig {
}
  • 위 예제는 `com.example.myapp` 패키지와 그 하위 패키지를 스캔해서 Bean을 자동 등록합니다.

 

더보기

@ComponentScan의 속성

  • basePackages: 특정 패키지를 스캔할 때 사용, 배열로 여러개를 선언할 수 있습니다.
    • 예시: `@ComponentScan(basePackages = {"com.example", "com.another"})`
  • basePackageClasses: 특정 클래스가 속한 패키지를 기준으로 스캔할 수 있습니다 .
    • 예시: `@ComponentScan(basePackageClasses = MyApp.class)`
  • excludeFilters: 스캔에서 제외할 클래스를 필터링할 수 있습니다 .
    • 예시: `@ComponentScan(excludeFilters = @ComponentScan.Filter(SomeClass.class))`
  • includeFilters: 특정 조건에 맞는 클래스만 스캔하여 포함할 수 있습니다 .
    • 예시: `@ComponentScan(includeFilters = @ComponentScan.Filter(Service.class))`

 


 

@ComponentScan의 동작 순서

1. Spring Application이 실행되면 `@ComponentScan`이 지정된 패키지로부터 시작해서 모든 클래스 파일을 확인합니다.

2. `@Component` 계열 annotaion이 붙은 클래스들을 찾아 Bean Definition으로 등록합니다.

3. 찾은 클래스를 Spring 컨테이너(IoC 컨테이너)에 등록합니다.

4. 나중에 필요할 때 DI(의존성 주입) 등을 통해 Bean 객체를 사용합니다.